��<!doctype html><html lang="en"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>DASH-IF implementation guidelines: restricted timing model</title> <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"> <style data-fill-with="stylesheet">/****************************************************************************** * Style sheet for the W3C specifications * * * Special classes handled by this style sheet include: * * Indices * - .toc for the Table of Contents (<ol class="toc">) * + <span class="secno"> for the section numbers * - #toc for the Table of Contents (<nav id="toc">) * - ul.index for Indices (<a href="#ref">term</a><span>, in �N.M</span>) * - table.index for Index Tables (e.g. for properties or elements) * * Structural Markup * - table.data for general data tables * -> use 'scope' attribute, <colgroup>, <thead>, and <tbody> for best results ! * -> use <table class='complex data'> for extra-complex tables * -> use <td class='long'> for paragraph-length cell content * -> use <td class='pre'> when manual line breaks/indentation would help readability * - dl.switch for switch statements * - ol.algorithm for algorithms (helps to visualize nesting) * - .figure and .caption (HTML4) and figure and figcaption (HTML5) * -> .sidefigure for right-floated figures * - ins/del * * Code * - pre and code * * Special Sections * - .note for informative notes (div, p, span, aside, details) * - .example for informative examples (div, p, pre, span) * - .issue for issues (div, p, span) * - .assertion for assertions (div, p, span) * - .advisement for loud normative statements (div, p, strong) * - .annoying-warning for spec obsoletion notices (div, aside, details) * * Definition Boxes * - pre.def for WebIDL definitions * - table.def for tables that define other entities (e.g. CSS properties) * - dl.def for definition lists that define other entitles (e.g. HTML elements) * * Numbering * - .secno for section numbers in .toc and headings (<span class='secno'>3.2</span>) * - .marker for source-inserted example/figure/issue numbers (<span class='marker'>Issue 4</span>) * - ::before styled for CSS-generated issue/example/figure numbers: * -> Documents wishing to use this only need to add * figcaption::before, * .caption::before { content: "Figure " counter(figure) " "; } * .example::before { content: "Example " counter(example) " "; } * .issue::before { content: "Issue " counter(issue) " "; } * * Header Stuff (ignore, just don't conflict with these classes) * - .head for the header * - .copyright for the copyright * * Miscellaneous * - .overlarge for things that should be as wide as possible, even if * that overflows the body text area. This can be used on an item or * on its container, depending on the effect desired. * Note that this styling basically doesn't help at all when printing, * since A4 paper isn't much wider than the max-width here. * It's better to design things to fit into a narrower measure if possible. * - js-added ToC jump links (see fixup.js) * ******************************************************************************/ /******************************************************************************/ /* Body */ /******************************************************************************/ body { counter-reset: example figure issue; /* Layout */ max-width: 50em; /* limit line length to 50em for readability */ margin: 0 auto; /* center text within page */ padding: 1.6em 1.5em 2em 50px; /* assume 16px font size for downlevel clients */ padding: 1.6em 1.5em 2em calc(26px + 1.5em); /* leave space for status flag */ /* Typography */ line-height: 1.5; font-family: sans-serif; widows: 2; orphans: 2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; /* Colors */ color: black; background: white top left fixed no-repeat; background-size: 25px auto; } /******************************************************************************/ /* Front Matter & Navigation */ /******************************************************************************/ /** Header ********************************************************************/ div.head { margin-bottom: 1em } div.head hr { border-style: solid; } div.head h1 { font-weight: bold; margin: 0 0 .1em; font-size: 220%; } div.head h2 { margin-bottom: 1.5em;} /** W3C Logo ******************************************************************/ .head .logo { float: right; margin: 0.4rem 0 0.2rem .4rem; } .head img[src*="logos/W3C"] { display: block; border: solid #1a5e9a; border-width: .65rem .7rem .6rem; border-radius: .4rem; background: #1a5e9a; color: white; font-weight: bold; } .head a:hover > img[src*="logos/W3C"], .head a:focus > img[src*="logos/W3C"] { opacity: .8; } .head a:active > img[src*="logos/W3C"] { background: #c00; border-color: #c00; } /* see also additional rules in Link Styling section */ /** Copyright *****************************************************************/ p.copyright, p.copyright small { font-size: small } /** Back to Top / ToC Toggle **************************************************/ @media print { #toc-nav { display: none; } } @media not print { #toc-nav { position: fixed; z-index: 2; bottom: 0; left: 0; margin: 0; min-width: 1.33em; border-top-right-radius: 2rem; box-shadow: 0 0 2px; font-size: 1.5em; color: black; } #toc-nav > a { display: block; white-space: nowrap; height: 1.33em; padding: .1em 0.3em; margin: 0; background: white; box-shadow: 0 0 2px; border: none; border-top-right-radius: 1.33em; background: white; } #toc-nav > #toc-jump { padding-bottom: 2em; margin-bottom: -1.9em; } #toc-nav > a:hover, #toc-nav > a:focus { background: #f8f8f8; } #toc-nav > a:not(:hover):not(:focus) { color: #707070; } /* statusbar gets in the way on keyboard focus; remove once browsers fix */ #toc-nav > a[href="#toc"]:not(:hover):focus:last-child { padding-bottom: 1.5rem; } #toc-nav:not(:hover) > a:not(:focus) > span + span { /* Ideally this uses :focus-within on #toc-nav */ display: none; } #toc-nav > a > span + span { padding-right: 0.2em; } #toc-toggle-inline { vertical-align: 0.05em; font-size: 80%; color: gray; color: hsla(203,20%,40%,.7); border-style: none; background: transparent; position: relative; } #toc-toggle-inline:hover:not(:active), #toc-toggle-inline:focus:not(:active) { text-shadow: 1px 1px silver; top: -1px; left: -1px; } #toc-nav :active { color: #C00; } } /** ToC Sidebar ***************************************************************/ /* Floating sidebar */ @media screen { body.toc-sidebar #toc { position: fixed; top: 0; bottom: 0; left: 0; width: 23.5em; max-width: 80%; max-width: calc(100% - 2em - 26px); overflow: auto; padding: 0 1em; padding-left: 42px; padding-left: calc(1em + 26px); background: inherit; background-color: #f7f8f9; z-index: 1; box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset; } body.toc-sidebar #toc h2 { margin-top: .8rem; font-variant: small-caps; font-variant: all-small-caps; text-transform: lowercase; font-weight: bold; color: gray; color: hsla(203,20%,40%,.7); } body.toc-sidebar #toc-jump:not(:focus) { width: 0; height: 0; padding: 0; position: absolute; overflow: hidden; } } /* Hide main scroller when only the ToC is visible anyway */ @media screen and (max-width: 28em) { body.toc-sidebar { overflow: hidden; } } /* Sidebar with its own space */ @media screen and (min-width: 78em) { body:not(.toc-inline) #toc { position: fixed; top: 0; bottom: 0; left: 0; width: 23.5em; overflow: auto; padding: 0 1em; padding-left: 42px; padding-left: calc(1em + 26px); background: inherit; background-color: #f7f8f9; z-index: 1; box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset; } body:not(.toc-inline) #toc h2 { margin-top: .8rem; font-variant: small-caps; font-variant: all-small-caps; text-transform: lowercase; font-weight: bold; color: gray; color: hsla(203,20%,40%,.7); } body:not(.toc-inline) { padding-left: 29em; } /* See also Overflow section at the bottom */ body:not(.toc-inline) #toc-jump:not(:focus) { width: 0; height: 0; padding: 0; position: absolute; overflow: hidden; } } @media screen and (min-width: 90em) { body:not(.toc-inline) { margin: 0 4em; } } /******************************************************************************/ /* Sectioning */ /******************************************************************************/ /** Headings ******************************************************************/ h1, h2, h3, h4, h5, h6, dt { page-break-after: avoid; page-break-inside: avoid; font: 100% sans-serif; /* Reset all font styling to clear out UA styles */ font-family: inherit; /* Inherit the font family. */ line-height: 1.2; /* Keep wrapped headings compact */ hyphens: manual; /* Hyphenated headings look weird */ } h2, h3, h4, h5, h6 { margin-top: 3rem; } h1, h2, h3 { color: #005A9C; background: transparent; } h1 { font-size: 170%; } h2 { font-size: 140%; } h3 { font-size: 120%; } h4 { font-weight: bold; } h5 { font-style: italic; } h6 { font-variant: small-caps; } dt { font-weight: bold; } /** Subheadings ***************************************************************/ h1 + h2, #subtitle { /* #subtitle is a subtitle in an H2 under the H1 */ margin-top: 0; } h2 + h3, h3 + h4, h4 + h5, h5 + h6 { margin-top: 1.2em; /* = 1 x line-height */ } /** Section divider ***********************************************************/ :not(.head) > hr { font-size: 1.5em; text-align: center; margin: 1em auto; height: auto; border: transparent solid 0; background: transparent; } :not(.head) > hr::before { content: "\2727\2003\2003\2727\2003\2003\2727"; } /******************************************************************************/ /* Paragraphs and Lists */ /******************************************************************************/ p { margin: 1em 0; } dd > p:first-child, li > p:first-child { margin-top: 0; } ul, ol { margin-left: 0; padding-left: 2em; } li { margin: 0.25em 0 0.5em; padding: 0; } dl dd { margin: 0 0 .5em 2em; } .head dd + dd { /* compact for header */ margin-top: -.5em; } /* Style for algorithms */ ol.algorithm ol:not(.algorithm), .algorithm > ol ol:not(.algorithm) { border-left: 0.5em solid #DEF; } /* Put nice boxes around each algorithm. */ [data-algorithm]:not(.heading) { padding: .5em; border: thin solid #ddd; border-radius: .5em; margin: .5em calc(-0.5em - 1px); } [data-algorithm]:not(.heading) > :first-child { margin-top: 0; } [data-algorithm]:not(.heading) > :last-child { margin-bottom: 0; } /* Style for switch/case <dl>s */ dl.switch > dd > ol.only, dl.switch > dd > .only > ol { margin-left: 0; } dl.switch > dd > ol.algorithm, dl.switch > dd > .algorithm > ol { margin-left: -2em; } dl.switch { padding-left: 2em; } dl.switch > dt { text-indent: -1.5em; margin-top: 1em; } dl.switch > dt + dt { margin-top: 0; } dl.switch > dt::before { content: '\21AA'; padding: 0 0.5em 0 0; display: inline-block; width: 1em; text-align: right; line-height: 0.5em; } /** Terminology Markup ********************************************************/ /******************************************************************************/ /* Inline Markup */ /******************************************************************************/ /** Terminology Markup ********************************************************/ dfn { /* Defining instance */ font-weight: bolder; } a > i { /* Instance of term */ font-style: normal; } dt dfn code, code.idl { font-size: medium; } dfn var { font-style: normal; } /** Change Marking ************************************************************/ del { color: red; text-decoration: line-through; } ins { color: #080; text-decoration: underline; } /** Miscellaneous improvements to inline formatting ***************************/ sup { vertical-align: super; font-size: 80% } /******************************************************************************/ /* Code */ /******************************************************************************/ /** General monospace/pre rules ***********************************************/ pre, code, samp { font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace; font-size: .9em; page-break-inside: avoid; hyphens: none; text-transform: none; } pre code, code code { font-size: 100%; } pre { margin-top: 1em; margin-bottom: 1em; overflow: auto; } /** Inline Code fragments *****************************************************/ /* Do something nice. */ /******************************************************************************/ /* Links */ /******************************************************************************/ /** General Hyperlinks ********************************************************/ /* We hyperlink a lot, so make it less intrusive */ a[href] { color: #034575; text-decoration: none; border-bottom: 1px solid #707070; /* Need a bit of extending for it to look okay */ padding: 0 1px 0; margin: 0 -1px 0; } a:visited { border-bottom-color: #BBB; } /* Use distinguishing colors when user is interacting with the link */ a[href]:focus, a[href]:hover { background: #f8f8f8; background: rgba(75%, 75%, 75%, .25); border-bottom-width: 3px; margin-bottom: -2px; } a[href]:active { color: #C00; border-color: #C00; } /* Backout above styling for W3C logo */ .head .logo, .head .logo a { border: none; text-decoration: none; background: transparent; } /******************************************************************************/ /* Images */ /******************************************************************************/ img { border-style: none; } /* For autogen numbers, add .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; } */ figure, .figure, .sidefigure { page-break-inside: avoid; text-align: center; margin: 2.5em 0; } .figure img, .sidefigure img, figure img, .figure object, .sidefigure object, figure object { max-width: 100%; margin: auto; } .figure pre, .sidefigure pre, figure pre { text-align: left; display: table; margin: 1em auto; } .figure table, figure table { margin: auto; } @media screen and (min-width: 20em) { .sidefigure { float: right; width: 50%; margin: 0 0 0.5em 0.5em } } .caption, figcaption, caption { font-style: italic; font-size: 90%; } .caption::before, figcaption::before, figcaption > .marker { font-weight: bold; } .caption, figcaption { counter-increment: figure; } /* DL list is indented 2em, but figure inside it is not */ dd > .figure, dd > figure { margin-left: -2em } /******************************************************************************/ /* Colored Boxes */ /******************************************************************************/ .issue, .note, .example, .assertion, .advisement, blockquote { padding: .5em; border: .5em; border-left-style: solid; page-break-inside: avoid; } span.issue, span.note { padding: .1em .5em .15em; border-right-style: solid; } .issue, .note, .example, .advisement, .assertion, blockquote { margin: 1em auto; } .note > p:first-child, .issue > p:first-child, blockquote > :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } /** Blockquotes ***************************************************************/ blockquote { border-color: silver; } /** Open issue ****************************************************************/ .issue { border-color: #E05252; background: #FBE9E9; counter-increment: issue; overflow: auto; } .issue::before, .issue > .marker { text-transform: uppercase; color: #AE1E1E; padding-right: 1em; text-transform: uppercase; } /* Add .issue::before { content: "Issue " counter(issue) " "; } for autogen numbers, or use class="marker" to mark up the issue number in source. */ /** Example *******************************************************************/ .example { border-color: #E0CB52; background: #FCFAEE; counter-increment: example; overflow: auto; clear: both; } .example::before, .example > .marker { text-transform: uppercase; color: #827017; min-width: 7.5em; display: block; } /* Add .example::before { content: "Example " counter(example) " "; } for autogen numbers, or use class="marker" to mark up the example number in source. */ /** Non-normative Note ********************************************************/ .note { border-color: #52E052; background: #E9FBE9; overflow: auto; } .note::before, .note > .marker, details.note > summary::before, details.note > summary > .marker { text-transform: uppercase; display: block; color: hsl(120, 70%, 30%); } /* Add .note::before { content: "Note"; } for autogen label, or use class="marker" to mark up the label in source. */ details.note > summary { display: block; color: hsl(120, 70%, 30%); } details.note[open] > summary { border-bottom: 1px silver solid; } /** Assertion Box *************************************************************/ /* for assertions in algorithms */ .assertion { border-color: #AAA; background: #EEE; } /** Advisement Box ************************************************************/ /* for attention-grabbing normative statements */ .advisement { border-color: orange; border-style: none solid; background: #FFEECC; } strong.advisement { display: block; text-align: center; } .advisement > .marker { color: #B35F00; } /** Spec Obsoletion Notice ****************************************************/ /* obnoxious obsoletion notice for older/abandoned specs. */ details { display: block; } summary { font-weight: bolder; } .annoying-warning:not(details), details.annoying-warning:not([open]) > summary, details.annoying-warning[open] { background: #fdd; color: red; font-weight: bold; padding: .75em 1em; border: thick red; border-style: solid; border-radius: 1em; } .annoying-warning :last-child { margin-bottom: 0; } @media not print { details.annoying-warning[open] { position: fixed; left: 1em; right: 1em; bottom: 1em; z-index: 1000; } } details.annoying-warning:not([open]) > summary { text-align: center; } /** Entity Definition Boxes ***************************************************/ .def { padding: .5em 1em; background: #DEF; margin: 1.2em 0; border-left: 0.5em solid #8CCBF2; } /******************************************************************************/ /* Tables */ /******************************************************************************/ th, td { text-align: left; text-align: start; } /** Property/Descriptor Definition Tables *************************************/ table.def { /* inherits .def box styling, see above */ width: 100%; border-spacing: 0; } table.def td, table.def th { padding: 0.5em; vertical-align: baseline; border-bottom: 1px solid #bbd7e9; } table.def > tbody > tr:last-child th, table.def > tbody > tr:last-child td { border-bottom: 0; } table.def th { font-style: italic; font-weight: normal; padding-left: 1em; width: 3em; } /* For when values are extra-complex and need formatting for readability */ table td.pre { white-space: pre-wrap; } /* A footnote at the bottom of a def table */ table.def td.footnote { padding-top: 0.6em; } table.def td.footnote::before { content: " "; display: block; height: 0.6em; width: 4em; border-top: thin solid; } /** Data tables (and properly marked-up index tables) *************************/ /* <table class="data"> highlights structural relationships in a table when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute) Use class="complex data" for particularly complicated tables -- (This will draw more lines: busier, but clearer.) Use class="long" on table cells with paragraph-like contents (This will adjust text alignment accordingly.) Alternately use class="longlastcol" on tables, to have the last column assume "long". */ table { word-wrap: normal; overflow-wrap: normal; hyphens: manual; } table.data, table.index { margin: 1em auto; border-collapse: collapse; border: hidden; width: 100%; } table.data caption, table.index caption { max-width: 50em; margin: 0 auto 1em; } table.data td, table.data th, table.index td, table.index th { padding: 0.5em 1em; border-width: 1px; border-color: silver; border-top-style: solid; } table.data thead td:empty { padding: 0; border: 0; } table.data thead, table.index thead, table.data tbody, table.index tbody { border-bottom: 2px solid; } table.data colgroup, table.index colgroup { border-left: 2px solid; } table.data tbody th:first-child, table.index tbody th:first-child { border-right: 2px solid; border-top: 1px solid silver; padding-right: 1em; } table.data th[colspan], table.data td[colspan] { text-align: center; } table.complex.data th, table.complex.data td { border: 1px solid silver; text-align: center; } table.data.longlastcol td:last-child, table.data td.long { vertical-align: baseline; text-align: left; } table.data img { vertical-align: middle; } /* Alternate table alignment rules table.data, table.index { text-align: center; } table.data thead th[scope="row"], table.index thead th[scope="row"] { text-align: right; } table.data tbody th:first-child, table.index tbody th:first-child { text-align: right; } Possible extra rowspan handling table.data tbody th[rowspan]:not([rowspan='1']), table.index tbody th[rowspan]:not([rowspan='1']), table.data tbody td[rowspan]:not([rowspan='1']), table.index tbody td[rowspan]:not([rowspan='1']) { border-left: 1px solid silver; } table.data tbody th[rowspan]:first-child, table.index tbody th[rowspan]:first-child, table.data tbody td[rowspan]:first-child, table.index tbody td[rowspan]:first-child{ border-left: 0; border-right: 1px solid silver; } */ /******************************************************************************/ /* Indices */ /******************************************************************************/ /** Table of Contents *********************************************************/ .toc a { /* More spacing; use padding to make it part of the click target. */ padding-top: 0.1rem; /* Larger, more consistently-sized click target */ display: block; /* Reverse color scheme */ color: black; border-color: #3980B5; border-bottom-width: 3px !important; margin-bottom: 0px !important; } .toc a:visited { border-color: #054572; } .toc a:not(:focus):not(:hover) { /* Allow colors to cascade through from link styling */ border-bottom-color: transparent; } .toc, .toc ol, .toc ul, .toc li { list-style: none; /* Numbers must be inlined into source */ /* because generated content isn't search/selectable and markers can't do multilevel yet */ margin: 0; padding: 0; line-height: 1.1rem; /* consistent spacing */ } /* ToC not indented until third level, but font style & margins show hierarchy */ .toc > li { font-weight: bold; } .toc > li li { font-weight: normal; } .toc > li li li { font-size: 95%; } .toc > li li li li { font-size: 90%; } .toc > li li li li .secno { font-size: 85%; } .toc > li li li li li { font-size: 85%; } .toc > li li li li li .secno { font-size: 100%; } /* @supports not (display:grid) { */ .toc > li { margin: 1.5rem 0; } .toc > li li { margin: 0.3rem 0; } .toc > li li li { margin-left: 2rem; } /* Section numbers in a column of their own */ .toc .secno { float: left; width: 4rem; white-space: nowrap; } .toc li { clear: both; } :not(li) > .toc { margin-left: 5rem; } .toc .secno { margin-left: -5rem; } .toc > li li li .secno { margin-left: -7rem; } .toc > li li li li .secno { margin-left: -9rem; } .toc > li li li li li .secno { margin-left: -11rem; } /* Tighten up indentation in narrow ToCs */ @media (max-width: 30em) { :not(li) > .toc { margin-left: 4rem; } .toc .secno { margin-left: -4rem; } .toc > li li li { margin-left: 1rem; } .toc > li li li .secno { margin-left: -5rem; } .toc > li li li li .secno { margin-left: -6rem; } .toc > li li li li li .secno { margin-left: -7rem; } } /* } */ @supports (display:grid) and (display:contents) { /* Use #toc over .toc to override non-@supports rules. */ #toc { display: grid; align-content: start; grid-template-columns: auto 1fr; grid-column-gap: 1rem; column-gap: 1rem; grid-row-gap: .6rem; row-gap: .6rem; } #toc h2 { grid-column: 1 / -1; margin-bottom: 0; } #toc ol, #toc li, #toc a { display: contents; /* Switch <a> to subgrid when supported */ } #toc span { margin: 0; } #toc > .toc > li > a > span { /* The spans of the top-level list, comprising the first items of each top-level section. */ margin-top: 1.1rem; } #toc#toc .secno { /* Ugh, need more specificity to override base.css */ grid-column: 1; width: auto; margin-left: 0; } #toc .content { grid-column: 2; width: auto; margin-right: 1rem; } #toc .content:hover { background: rgba(75%, 75%, 75%, .25); border-bottom: 3px solid #054572; margin-bottom: -3px; } #toc li li li .content { margin-left: 1rem; } #toc li li li li .content { margin-left: 2rem; } } /** Index *********************************************************************/ /* Index Lists: Layout */ ul.index { margin-left: 0; columns: 15em; text-indent: 1em hanging; } ul.index li { margin-left: 0; list-style: none; break-inside: avoid; } ul.index li li { margin-left: 1em } ul.index dl { margin-top: 0; } ul.index dt { margin: .2em 0 .2em 20px;} ul.index dd { margin: .2em 0 .2em 40px;} /* Index Lists: Typography */ ul.index ul, ul.index dl { font-size: smaller; } @media not print { ul.index li span { white-space: nowrap; color: transparent; } ul.index li a:hover + span, ul.index li a:focus + span { color: #707070; } } /** Index Tables *****************************************************/ /* See also the data table styling section, which this effectively subclasses */ table.index { font-size: small; border-collapse: collapse; border-spacing: 0; text-align: left; margin: 1em 0; } table.index td, table.index th { padding: 0.4em; } table.index tr:hover td:not([rowspan]), table.index tr:hover th:not([rowspan]) { background: #f7f8f9; } /* The link in the first column in the property table (formerly a TD) */ table.index th:first-child a { font-weight: bold; } /******************************************************************************/ /* Print */ /******************************************************************************/ @media print { /* Pages have their own margins. */ html { margin: 0; } /* Serif for print. */ body { font-family: serif; } } @page { margin: 1.5cm 1.1cm; } /******************************************************************************/ /* Legacy */ /******************************************************************************/ /* This rule is inherited from past style sheets. No idea what it's for. */ .hide { display: none } /******************************************************************************/ /* Overflow Control */ /******************************************************************************/ .figure .caption, .sidefigure .caption, figcaption { /* in case figure is overlarge, limit caption to 50em */ max-width: 50rem; margin-left: auto; margin-right: auto; } .overlarge { /* Magic to create good table positioning: "content column" is 50ems wide at max; less on smaller screens. Extra space (after ToC + content) is empty on the right. 1. When table < content column, centers table in column. 2. When content < table < available, left-aligns. 3. When table > available, fills available + scroll bar. */ display: grid; grid-template-columns: minmax(0, 50em); } .overlarge > table { /* limit preferred width of table */ max-width: 50em; margin-left: auto; margin-right: auto; } @media (min-width: 55em) { .overlarge { margin-right: calc(13px + 26.5rem - 50vw); max-width: none; } } @media screen and (min-width: 78em) { body:not(.toc-inline) .overlarge { /* 30.5em body padding 50em content area */ margin-right: calc(40em - 50vw) !important; } } @media screen and (min-width: 90em) { body:not(.toc-inline) .overlarge { /* 4em html margin 30.5em body padding 50em content area */ margin-right: calc(84.5em - 100vw) !important; } } @media not print { .overlarge { overflow-x: auto; /* See Lea Verou's explanation background-attachment: * http://lea.verou.me/2012/04/background-attachment-local/ * background: top left / 4em 100% linear-gradient(to right, #ffffff, rgba(255, 255, 255, 0)) local, top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local, top left / 1em 100% linear-gradient(to right, #c3c3c5, rgba(195, 195, 197, 0)) scroll, top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll, white; background-repeat: no-repeat; */ } } </style> <meta content="Bikeshed version 40de15f9, updated Thu Jun 11 17:47:04 2020 -0700" name="generator"> <link href="https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html" rel="canonical"> <style>/* style-autolinks */ .css.css, .property.property, .descriptor.descriptor { color: #005a9c; font-size: inherit; font-family: inherit; } .css::before, .property::before, .descriptor::before { content: " "; } .css::after, .property::after, .descriptor::after { content: " "; } .property, .descriptor { /* Don't wrap property and descriptor names */ white-space: nowrap; } .type { /* CSS value <type> */ font-style: italic; } pre .property::before, pre .property::after { content: ""; } [data-link-type="property"]::before, [data-link-type="propdesc"]::before, [data-link-type="descriptor"]::before, [data-link-type="value"]::before, [data-link-type="function"]::before, [data-link-type="at-rule"]::before, [data-link-type="selector"]::before, [data-link-type="maybe"]::before { content: " "; } [data-link-type="property"]::after, [data-link-type="propdesc"]::after, [data-link-type="descriptor"]::after, [data-link-type="value"]::after, [data-link-type="function"]::after, [data-link-type="at-rule"]::after, [data-link-type="selector"]::after, [data-link-type="maybe"]::after { content: " "; } [data-link-type].production::before, [data-link-type].production::after, .prod [data-link-type]::before, .prod [data-link-type]::after { content: ""; } [data-link-type=element], [data-link-type=element-attr] { font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace; font-size: .9em; } [data-link-type=element]::before { content: "<" } [data-link-type=element]::after { content: ">" } [data-link-type=biblio] { white-space: pre; }</style> <style>/* style-counters */ body { counter-reset: example figure issue; } .issue { counter-increment: issue; } .issue:not(.no-marker)::before { content: "Issue " counter(issue); } .example { counter-increment: example; } .example:not(.no-marker)::before { content: "Example " counter(example); } .invalid.example:not(.no-marker)::before, .illegal.example:not(.no-marker)::before { content: "Invalid Example" counter(example); } figcaption { counter-increment: figure; } figcaption:not(.no-marker)::before { content: "Figure " counter(figure) " "; }</style> <style>/* style-dfn-panel */ .dfn-panel { position: absolute; z-index: 35; height: auto; width: -webkit-fit-content; width: fit-content; max-width: 300px; max-height: 500px; overflow: auto; padding: 0.5em 0.75em; font: small Helvetica Neue, sans-serif, Droid Sans Fallback; background: #DDDDDD; color: black; border: outset 0.2em; } .dfn-panel:not(.on) { display: none; } .dfn-panel * { margin: 0; padding: 0; text-indent: 0; } .dfn-panel > b { display: block; } .dfn-panel a { color: black; } .dfn-panel a:not(:hover) { text-decoration: none !important; border-bottom: none !important; } .dfn-panel > b + b { margin-top: 0.25em; } .dfn-panel ul { padding: 0; } .dfn-panel li { list-style: inside; } .dfn-panel.activated { display: inline-block; position: fixed; left: .5em; bottom: 2em; margin: 0 auto; max-width: calc(100vw - 1.5em - .4em - .5em); max-height: 30vh; } .dfn-paneled { cursor: pointer; } </style> <style>/* style-md-lists */ /* This is a weird hack for me not yet following the commonmark spec regarding paragraph and lists. */ [data-md] > :first-child { margin-top: 0; } [data-md] > :last-child { margin-bottom: 0; }</style> <style>/* style-selflinks */ .heading, .issue, .note, .example, li, dt { position: relative; } a.self-link { position: absolute; top: 0; left: calc(-1 * (3.5rem - 26px)); width: calc(3.5rem - 26px); height: 2em; text-align: center; border: none; transition: opacity .2s; opacity: .5; } a.self-link:hover { opacity: 1; } .heading > a.self-link { font-size: 83%; } li > a.self-link { left: calc(-1 * (3.5rem - 26px) - 2em); } dfn > a.self-link { top: auto; left: auto; opacity: 0; width: 1.5em; height: 1.5em; background: gray; color: white; font-style: normal; transition: opacity .2s, background-color .2s, color .2s; } dfn:hover > a.self-link { opacity: 1; } dfn > a.self-link:hover { color: black; } a.self-link::before { content: "�"; } .heading > a.self-link::before { content: "�"; } dfn > a.self-link::before { content: "#"; }</style> <style>/* style-syntax-highlighting */ .highlight:not(.idl) { background: hsl(24, 20%, 95%); } code.highlight { padding: .1em; border-radius: .3em; } pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; } c-[a] { color: #990055 } /* Keyword.Declaration */ c-[b] { color: #990055 } /* Keyword.Type */ c-[c] { color: #708090 } /* Comment */ c-[d] { color: #708090 } /* Comment.Multiline */ c-[e] { color: #0077aa } /* Name.Attribute */ c-[f] { color: #669900 } /* Name.Tag */ c-[g] { color: #222222 } /* Name.Variable */ c-[k] { color: #990055 } /* Keyword */ c-[l] { color: #000000 } /* Literal */ c-[m] { color: #000000 } /* Literal.Number */ c-[n] { color: #0077aa } /* Name */ c-[o] { color: #999999 } /* Operator */ c-[p] { color: #999999 } /* Punctuation */ c-[s] { color: #a67f59 } /* Literal.String */ c-[t] { color: #a67f59 } /* Literal.String.Single */ c-[u] { color: #a67f59 } /* Literal.String.Double */ c-[cp] { color: #708090 } /* Comment.Preproc */ c-[c1] { color: #708090 } /* Comment.Single */ c-[cs] { color: #708090 } /* Comment.Special */ c-[kc] { color: #990055 } /* Keyword.Constant */ c-[kn] { color: #990055 } /* Keyword.Namespace */ c-[kp] { color: #990055 } /* Keyword.Pseudo */ c-[kr] { color: #990055 } /* Keyword.Reserved */ c-[ld] { color: #000000 } /* Literal.Date */ c-[nc] { color: #0077aa } /* Name.Class */ c-[no] { color: #0077aa } /* Name.Constant */ c-[nd] { color: #0077aa } /* Name.Decorator */ c-[ni] { color: #0077aa } /* Name.Entity */ c-[ne] { color: #0077aa } /* Name.Exception */ c-[nf] { color: #0077aa } /* Name.Function */ c-[nl] { color: #0077aa } /* Name.Label */ c-[nn] { color: #0077aa } /* Name.Namespace */ c-[py] { color: #0077aa } /* Name.Property */ c-[ow] { color: #999999 } /* Operator.Word */ c-[mb] { color: #000000 } /* Literal.Number.Bin */ c-[mf] { color: #000000 } /* Literal.Number.Float */ c-[mh] { color: #000000 } /* Literal.Number.Hex */ c-[mi] { color: #000000 } /* Literal.Number.Integer */ c-[mo] { color: #000000 } /* Literal.Number.Oct */ c-[sb] { color: #a67f59 } /* Literal.String.Backtick */ c-[sc] { color: #a67f59 } /* Literal.String.Char */ c-[sd] { color: #a67f59 } /* Literal.String.Doc */ c-[se] { color: #a67f59 } /* Literal.String.Escape */ c-[sh] { color: #a67f59 } /* Literal.String.Heredoc */ c-[si] { color: #a67f59 } /* Literal.String.Interpol */ c-[sx] { color: #a67f59 } /* Literal.String.Other */ c-[sr] { color: #a67f59 } /* Literal.String.Regex */ c-[ss] { color: #a67f59 } /* Literal.String.Symbol */ c-[vc] { color: #0077aa } /* Name.Variable.Class */ c-[vg] { color: #0077aa } /* Name.Variable.Global */ c-[vi] { color: #0077aa } /* Name.Variable.Instance */ c-[il] { color: #000000 } /* Literal.Number.Integer.Long */ </style> <body class="h-entry"> <div class="head"> <p data-fill-with="logo"><a href="https://dashif.org/"><img src="Images/DASH-IF.png"></a> </p> <h1 class="p-name no-ref" id="title">DASH-IF implementation guidelines: restricted timing model</h1> <h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Commit Snapshot, <time class="dt-updated" datetime="2020-06-12">12 June 2020</time></span></h2> <div data-fill-with="spec-metadata"> <dl> <dt>This version: <dd><a class="u-url" href="https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html">https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html</a> <dt>Issue Tracking: <dd><a href="https://github.com/Dash-Industry-Forum/Guidelines-TimingModel/issues">GitHub</a> <dd><a href="#issues-index">Inline In Spec</a> <dt class="editor">Editors: <dd class="editor p-author h-card vcard"><span class="p-name fn">DASH Industry Forum</span> <dd class="editor p-author h-card vcard"><span class="p-name fn"></span> </dl> </div> <div data-fill-with="warning"></div> <hr title="Separator for header"> </div> <div data-fill-with="at-risk"></div> <nav data-fill-with="table-of-contents" id="toc"> <h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2> <ol class="toc" role="directory"> <li><a href="#why-does-this-document-exist"><span class="secno">1</span> <span class="content">Purpose</span></a> <li><a href="#interpretation"><span class="secno">2</span> <span class="content">Interpretation</span></a> <li><a href="#legal"><span class="secno">3</span> <span class="content">Disclaimer</span></a> <li> <a href="#dash-is-important"><span class="secno">4</span> <span class="content">DASH and related standards</span></a> <ol class="toc"> <li><a href="#what-is-dash"><span class="secno">4.1</span> <span class="content">Structure of a DASH presentation</span></a> <li><a href="#terms-cross-reference"><span class="secno">4.2</span> <span class="content">Terminology cross-reference across standards</span></a> <li><a href="#confusing-terms"><span class="secno">4.3</span> <span class="content">Terminology choices in this document</span></a> </ol> <li><a href="#timing"><span class="secno">5</span> <span class="content">Goal of the interoperable timing model</span></a> <li><a href="#mpd-general-timeline"><span class="secno">6</span> <span class="content">MPD timeline</span></a> <li><a href="#timing-and-presentation-types"><span class="secno">7</span> <span class="content">Presentation timing characteristics</span></a> <li> <a href="#period-timing"><span class="secno">8</span> <span class="content">Period timing</span></a> <ol class="toc"> <li><a href="#timing-period-static"><span class="secno">8.1</span> <span class="content">First and last period timing in static presentations</span></a> <li><a href="#timing-period-dynamic"><span class="secno">8.2</span> <span class="content">First and last period timing in dynamic presentations</span></a> </ol> <li> <a href="#representation-timing"><span class="secno">9</span> <span class="content">Representation timing</span></a> <ol class="toc"> <li><a href="#timing-sampletimeline"><span class="secno">9.1</span> <span class="content">Sample timeline</span></a> <li> <a href="#timing-segment-references"><span class="secno">9.2</span> <span class="content">Referencing media segments</span></a> <ol class="toc"> <li><a href="#necessary-references-static"><span class="secno">9.2.1</span> <span class="content">Necessary segment references in static presentations</span></a> <li><a href="#necessary-references-dynamic"><span class="secno">9.2.2</span> <span class="content">Necessary segment references in dynamic presentations</span></a> <li><a href="#unnecessary-segment-references"><span class="secno">9.2.3</span> <span class="content">Removal of unnecessary segment references</span></a> </ol> <li><a href="#timing-period-representation-alignment"><span class="secno">9.3</span> <span class="content">Alignment of periods and representations</span></a> </ol> <li> <a href="#no-clock-drift"><span class="secno">10</span> <span class="content">Clock drift is forbidden</span></a> <ol class="toc"> <li><a href="#clock-drift-ugly-hacks"><span class="secno">10.1</span> <span class="content">Workarounds for clock drift</span></a> </ol> <li><a href="#timing-mediasegment"><span class="secno">11</span> <span class="content">Media segments</span></a> <li> <a href="#timing-connectivity"><span class="secno">12</span> <span class="content">Period connectivity</span></a> <ol class="toc"> <li><a href="#connectivity-duplicates"><span class="secno">12.1</span> <span class="content">Segment reference duplication during connected period transitions</span></a> <li><a href="#timing-continuity"><span class="secno">12.2</span> <span class="content">Period continuity</span></a> </ol> <li> <a href="#timing-dynamic"><span class="secno">13</span> <span class="content">Dynamic presentations</span></a> <ol class="toc"> <li><a href="#clock-sync"><span class="secno">13.1</span> <span class="content">Clock synchronization</span></a> <li><a href="#leap-seconds"><span class="secno">13.2</span> <span class="content">Leap seconds</span></a> <li><a href="#timing-availability"><span class="secno">13.3</span> <span class="content">Availability</span></a> <li><a href="#timing-timeshift"><span class="secno">13.4</span> <span class="content">Time shift buffer</span></a> <li><a href="#timing-delay"><span class="secno">13.5</span> <span class="content">Presentation delay</span></a> <li> <a href="#timing-mpd-updates"><span class="secno">13.6</span> <span class="content">MPD updates</span></a> <ol class="toc"> <li> <a href="#timing-mpd-mup"><span class="secno">13.6.1</span> <span class="content">MPD snapshot validity</span></a> <ol class="toc"> <li><a href="#timing-mpd-inband"><span class="secno">13.6.1.1</span> <span class="content">In-band MPD validity events</span></a> </ol> <li><a href="#timing-mpd-updates-add-content"><span class="secno">13.6.2</span> <span class="content">Adding content to the MPD</span></a> <li><a href="#timing-mpd-updates-remove-content"><span class="secno">13.6.3</span> <span class="content">Removing content from the MPD</span></a> <li><a href="#timing-mpd-updates-theend"><span class="secno">13.6.4</span> <span class="content">End of live content</span></a> </ol> <li> <a href="#timing-mpd-refreshes"><span class="secno">13.7</span> <span class="content">MPD refreshes</span></a> <ol class="toc"> <li><a href="#conditional-mpd-downloads"><span class="secno">13.7.1</span> <span class="content">Conditional MPD downloads</span></a> </ol> </ol> <li><a href="#missing-segments"><span class="secno">14</span> <span class="content">Segment loss handling</span></a> <li><a href="#standalone-text-timing"><span class="secno">15</span> <span class="content">Timing of stand-alone IMSC1 and WebVTT text files</span></a> <li><a href="#timing-nonos"><span class="secno">16</span> <span class="content">Forbidden techniques</span></a> <li> <a href="#timing-examples"><span class="secno">17</span> <span class="content">Examples</span></a> <ol class="toc"> <li><a href="#timing-examples-not-same-length"><span class="secno">17.1</span> <span class="content">Offer content with imperfectly aligned tracks</span></a> <li><a href="#timing-examples-splitperiod"><span class="secno">17.2</span> <span class="content">Split a period</span></a> <li><a href="#timing-examples-defaultkid"><span class="secno">17.3</span> <span class="content">Change the default_KID</span></a> </ol> <li> <a href="#addressing"><span class="secno">18</span> <span class="content">Segment addressing modes</span></a> <ol class="toc"> <li><a href="#addressing-indexed"><span class="secno">18.1</span> <span class="content">Indexed addressing</span></a> <li> <a href="#addressing-indexed-indexstructure"><span class="secno">18.2</span> <span class="content">Structure of the index segment</span></a> <ol class="toc"> <li><a href="#addressing-indexed-startpoint"><span class="secno">18.2.1</span> <span class="content">Moving the period start point (indexed addressing)</span></a> </ol> <li> <a href="#addressing-explicit"><span class="secno">18.3</span> <span class="content">Explicit addressing</span></a> <ol class="toc"> <li><a href="#addressing-explicit-startpoint"><span class="secno">18.3.1</span> <span class="content">Moving the period start point (explicit addressing)</span></a> </ol> <li> <a href="#addressing-simple"><span class="secno">18.4</span> <span class="content">Simple addressing</span></a> <ol class="toc"> <li><a href="#addressing-simple-inaccuracy"><span class="secno">18.4.1</span> <span class="content">Inaccuracy in media segment timing when using simple addressing</span></a> <li><a href="#addressing-simple-startpoint"><span class="secno">18.4.2</span> <span class="content">Moving the period start point (simple addressing)</span></a> <li><a href="#addressing-simple-to-explicit"><span class="secno">18.4.3</span> <span class="content">Converting simple addressing to explicit addressing</span></a> </ol> </ol> <li><a href="#timescale-constraints"><span class="secno">19</span> <span class="content">Large timescales and time values</span></a> <li><a href="#xml-duration-constraints"><span class="secno">20</span> <span class="content">Representing durations in XML</span></a> <li><a href="#conformance"><span class="secno"></span> <span class="content"> Conformance</span></a> <li> <a href="#index"><span class="secno"></span> <span class="content">Index</span></a> <ol class="toc"> <li><a href="#index-defined-here"><span class="secno"></span> <span class="content">Terms defined by this specification</span></a> </ol> <li> <a href="#references"><span class="secno"></span> <span class="content">References</span></a> <ol class="toc"> <li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a> <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a> </ol> <li><a href="#issues-index"><span class="secno"></span> <span class="content">Issues Index</span></a> </ol> </nav> <main> <h2 class="heading settled" data-level="1" id="why-does-this-document-exist"><span class="secno">1. </span><span class="content">Purpose</span><a class="self-link" href="#why-does-this-document-exist"></a></h2> <p>The guidelines defined in this document support the creation of interoperable services for high-quality video distribution based on MPEG-DASH and related standards. These guidelines are provided in order to address DASH-IF members' needs and industry best practices. The guidelines support the implementation of conforming service offerings as well as DASH client implementations.</p> <p>The restricted timing model constrains the ordinary timing model defined in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> primarily by disallowing gaps in presentations, thereby increasing the compatibility of DASH services with devices that do not have robust support for playback of content with gaps.</p> <p>This timing model also provides editorial flexibility for the presentation author by allowing new periods to be started at any point. This is achieved by:</p> <ol> <li data-md> <p>Strictly defining the period boundary rules on the DASH service side.</p> <li data-md> <p>Permitting fleixble behavior from clients in how they transition between periods (to account for implementation limitations).</p> </ol> <p class="note" role="note"><span>Note:</span> Some alternative timing model interpretations significantly restrict the ability of content authors to define period boundaries.</p> <p>In addition to defining the constraints for a restricted timing model, this document attempts to explain and illustrate many DASH timing concepts that often cause confusion, without constraining them further than already done by DASH-IF general guidelines, <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> or <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a>.</p> <p>While alternative interpretations may be equally valid in terms of standards conformance, services and clients created following the guidelines defined in this document can be expected to exhibit highly interoperable behavior between different implementations.</p> <p>This part of the DASH-IF implementation guidelines is published as a stand-alone document for editorial reasons. Refer to the master document to understand the context in which this document should be viewed.</p> <h2 class="heading settled" data-level="2" id="interpretation"><span class="secno">2. </span><span class="content">Interpretation</span><a class="self-link" href="#interpretation"></a></h2> <p>Requirements in this document describe service and client behaviors that DASH-IF considers interoperable.</p> <p>If a <strong>service provider</strong> follows these requirements in a published DASH service, the published DASH service is likely to experience successful playback on a wide variety of clients and exhibit graceful degradation when a client does not support all features used by the service.</p> <p>If a <strong>client implementer</strong> follows the client-oriented requirements described in this document, the DASH client will play content conforming to this document provided that the client device media platform supports all features used by a particular DASH service (e.g. the codecs and DRM systems).</p> <p>This document uses statements of fact when describing normative requirements defined in referenced specifications such as <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> and <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a>. References are typically provided to indicate where the requirements are defined.</p> <p><a data-link-type="biblio" href="#biblio-rfc2119">[RFC2119]</a> statements (e.g. "SHALL", "SHOULD" and "MAY") are used when this document defines a new requirement or further constrains a requirement from a referenced document.</p> <div class="example" id="example-c0cb5558"> <a class="self-link" href="#example-c0cb5558"></a> Statement of fact: <ul> <li data-md> <p>A DASH presentation <strong>is</strong> a sequence of consecutive non-overlapping periods <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>.</p> </ul> <p>New or more constrained requirement:</p> <ul> <li data-md> <p>Segments <strong>SHALL NOT</strong> use the MPEG-TS container format.</p> </ul> </div> <p>There is no strict backward compatibility with previous versions - best practices change over time and what was once considered sensible may be replaced by a superior approach later on. Therefore, clients and services that were conforming to version N of this document are not guaranteed to conform to version N+1.</p> <h2 class="heading settled" data-level="3" id="legal"><span class="secno">3. </span><span class="content">Disclaimer</span><a class="self-link" href="#legal"></a></h2> <p>This is a document made available by DASH-IF. The technology embodied in this document may involve the use of intellectual property rights, including patents and patent applications owned or controlled by any of the authors or developers of this document. No patent license, either implied or express, is granted to you by this document. DASH-IF has made no search or investigation for such rights and DASH-IF disclaims any duty to do so. The rights and obligations which apply to DASH-IF documents, as such rights and obligations are set forth and defined in the DASH-IF Bylaws and IPR Policy including, but not limited to, patent and other intellectual property license rights and obligations. A copy of the DASH-IF Bylaws and IPR Policy can be obtained at http://dashif.org/.</p> <p>The material contained herein is provided on an "AS IS" basis and to the maximum extent permitted by applicable law, this material is provided AS IS, and the authors and developers of this material and DASH-IF hereby disclaim all other warranties and conditions, either express, implied or statutory, including, but not limited to, any (if any) implied warranties, duties or conditions of merchantability, of fitness for a particular purpose, of accuracy or completeness of responses, of workmanlike effort, and of lack of negligence.</p> <p>In addition, this document may include references to documents and/or technologies controlled by third parties. Those third party documents and technologies may be subject to third party rules and licensing terms. No intellectual property license, either implied or express, to any third party material is granted to you by this document or DASH-IF. DASH-IF makes no any warranty whatsoever for such third party material.</p> <p>Note that technologies included in this document and for which no test and conformance material is provided, are only published as a candidate technologies, and may be removed if no test material is provided before releasing a new version of this guidelines document. For the availability of test material, please check http://www.dashif.org.</p> <h2 class="heading settled" data-level="4" id="dash-is-important"><span class="secno">4. </span><span class="content">DASH and related standards</span><a class="self-link" href="#dash-is-important"></a></h2> <p>DASH (dynamic adaptive streaming over HTTP) <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> is a technology for adaptive media delivery. Initially published by ISO/IEC in April 2012, it has been continually updated, with the 4th edition published in 2020.</p> <p>CMAF (common media application format) <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> is a media container format based on ISO Base Media File Format <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a>. It defines data structures for media delivery compatible with DASH and other similar technologies such as <a data-link-type="biblio" href="#biblio-hls">[HLS]</a>. Initially published by ISO/IEC in 2018, it has been updated in 2019 with the publishing of the 2nd edition.</p> <p>This document is based on the 4th edition DASH <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> and 2nd edition CMAF <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> specifications.</p> <p>DASH together with related standards and specifications is the foundation for an ecosystem of services and clients that work together to enable audio/video/text and related content to be presented to end-users.</p> <figure> <img src="Images/RoleOfIop.png"> <figcaption>This document connects DASH with international standards and industry specifications.</figcaption> </figure> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> defines a highly flexible set of building blocks that needs to be constrained to ensure interoperable behavior in common scenarios. The necessary media container constraints are largely defined by <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> and <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>. This document defines further constraints to limit DASH features to those that are considered appropriate for use in interoperable clients and services.</p> <p>Clients consuming DASH content will need to interact with the host device s media platform. The guidelines in this document assume that the media platform implements APIs that are equivalent to Media Source Extensions <a data-link-type="biblio" href="#biblio-media-source">[media-source]</a> and Encrypted Media Extensions <a data-link-type="biblio" href="#biblio-encrypted-media">[encrypted-media]</a>. API level compatibility is not required but equivalent features are expected.</p> <p>This document was generated in close coordination with <a data-link-type="biblio" href="#biblio-dvb-dash">[DVB-DASH]</a>. The features are aligned to the extent considered reasonable. The tools and features are aligned to the extent considered reasonable. In addition, DASH-IF worked closely with ATSC to develop a DASH profile for ATSC3.0 for broadcast distribution <a data-link-type="biblio" href="#biblio-atsc3">[ATSC3]</a>.</p> <h3 class="heading settled" data-level="4.1" id="what-is-dash"><span class="secno">4.1. </span><span class="content">Structure of a DASH presentation</span><a class="self-link" href="#what-is-dash"></a></h3> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> specifies the structure of a DASH <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="presentation">presentation</dfn>, which consists primarily of:</p> <ol> <li data-md> <p>The manifest or <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="mpd">MPD</dfn>, which describes the content and how it can be accessed.</p> <li data-md> <p>Data containers that clients will download during playback of a <a data-link-type="dfn" href="#presentation" id="ref-for-presentation">presentation</a> in order to obtain media samples.</p> </ol> <figure> <img src="Diagrams/DashStructure.png"> <figcaption>Relationships of primary DASH data structures and the standards they are defined in.</figcaption> </figure> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpd">MPD</a> is an XML file that follows a schema defined in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>. Various 3rd party extension points are defined in the XML schema. This document defines some extensions, as do other industry specifications.</p> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> defines two data container formats, one based on <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> and the other <a data-link-type="biblio" href="#biblio-mpeg2ts">[MPEG2TS]</a>. However, only the former is used in modern solutions. This document only supports services using the <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> container format.</p> <p><a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> is a constrained media format based on <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a>, specifically designed for adaptive streaming. This document requires the use of <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> compatible data containers. The requirements for the usage of CMAF with DASH are defined by <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>.</p> <p class="note" role="note"><span>Note:</span> The relationship to <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> is constrained to the container format, as primarily expressed by <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>. In particular, there is no requirement to conform to <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> media profiles.</p> <p>The data container format defines the physical structure of the following components of a <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$">presentation</a>:</p> <ol> <li data-md> <p>Each <a data-link-type="dfn" href="#representations" id="ref-for-representations">representation</a> contains an initialization segment.</p> <li data-md> <p>Each <a data-link-type="dfn" href="#representations" id="ref-for-representations`$">representation</a> contains any number of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment">media segments</a>.</p> <li data-md> <p>Some <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$">representations</a> may contain an index segment, depending on the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modes">addressing mode</a> used.</p> </ol> <p class="note" role="note"><span>Note:</span> HLS (HTTP Live Streaming) <a data-link-type="biblio" href="#biblio-hls">[HLS]</a> is an adaptive media delivery technology similar to DASH that also supports CMAF. Under certain constraints, content conforming to CMAF can be delivered to clients using both DASH and HLS.</p> <h3 class="heading settled" data-level="4.2" id="terms-cross-reference"><span class="secno">4.2. </span><span class="content">Terminology cross-reference across standards</span><a class="self-link" href="#terms-cross-reference"></a></h3> <p>Different documents often use different terms to refer to the same structural components of DASH <a data-link-type="dfn" href="#presentation" id="ref-for-presentationa$">presentations</a>. A quick cross-reference of terms commonly found causing confusion is presented here:</p> <figure id="cmaf-terms"> <table class="data"> <thead> <tr> <th><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> <th><a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> <th><a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> <tbody> <tr> <td>(media) segment, subsegment <td>CMAF segment, CMAF fragment <td> <tr> <td>initialization segment <td>CMAF header <td> <tr> <td>index segment, segment index <td> <td>segment index box (<code class="highlight">sidx</code>) </table> <figcaption>Cross-reference of closely related terms in different standards.</figcaption> </figure> <h3 class="heading settled" data-level="4.3" id="confusing-terms"><span class="secno">4.3. </span><span class="content">Terminology choices in this document</span><a class="self-link" href="#confusing-terms"></a></h3> <p>This document is intended to be a set of guidelines easily understood by solution designers and developers. In the interest of ease of understanding, some important adjustments in terminology are made compared to the underlying standards, described here.</p> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> has the concept of "segment" (URL-addressable media object) and "subsegment" (byte range of URL-addressable media object), whereas <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> does not make such a distinction. This document uses <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> terminology, with the term "segment" in this document being equivalent to "CMAF segment". The term "segment" in this document may be equivalent to either "segment" or "subsegment" in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>, depending on the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modes`$">addressing mode</a> used.</p> <p>This document s concept of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline">MPD timeline</a> is not directly expressed in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>. To improve understandability of the timing model, this document splits the DASH concept of "presentation timeline" (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 7.2.1) into two separate concepts: the aggregated component (<a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$">MPD timeline</a>) and the <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$">representation</a> specific component (<a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline">sample timeline</a>). These concepts are distinct but mutually connected via metadata in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$">MPD</a>.</p> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> uses "representation" to refer to a set of files and associated metadata, with the same "representation" possibly used in different parts of a DASH <a data-link-type="dfn" href="#presentation" id="ref-for-presentationb$">presentation</a> and/or in different <a data-link-type="dfn" href="#presentation" id="ref-for-presentationc$">presentations</a>. This document uses <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$">representation</a> to refer to an individual instance of a <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> "representation" - a set of data in an <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$">MPD</a> that references some files containing media samples. Using the same files in two places effecticely means using two <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$">representations</a>, whereas in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> terminology it would be valid to call that a single <a data-link-type="dfn" href="#representations" id="ref-for-representationse$">representation</a> used with individual conditions/caveats that apply to each usage. The deviation in terminology is intentional as it simplifies understanding and avoids having to juggle the two concepts (as the "shared" view is typically not relevant).</p> <h2 class="heading settled" data-level="5" id="timing"><span class="secno">5. </span><span class="content">Goal of the interoperable timing model</span><a class="self-link" href="#timing"></a></h2> <p>The purpose of this document is to give a holistic overview of DASH <a data-link-type="dfn" href="#presentation" id="ref-for-presentationd$">presentation</a> timing and segment addressing, explaining the existing building blocks and rules defined by <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> and adding further constraints to achieve greater interoperability between DASH services and clients.</p> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 4.3 and 7.2.1 define the high-level structure and timing concepts of DASH, with <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a> further relating them to <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> concepts. The DASH-IF implementation guidelines allow considerably less flexibility in timing than provided by <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>, constraining services to a specific set of reasonably flexible behaviors that are highly interoperable with modern client platforms.</p> <p>This document defines an interoperable timing model and documents segment addressing logic suitable for interoperable use cases. Alternative interpretations of DASH timing may be equally valid from a standards conformance viewpoint.</p> <h2 class="heading settled" data-level="6" id="mpd-general-timeline"><span class="secno">6. </span><span class="content">MPD timeline</span><a class="self-link" href="#mpd-general-timeline"></a></h2> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$">MPD</a> defines the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="mpd-timeline">MPD timeline</dfn> of a DASH <a data-link-type="dfn" href="#presentation" id="ref-for-presentatione$">presentation</a>, which serves as the baseline for all scheduling decisions made during playback and establishes the relative timing of <a data-link-type="dfn" href="#periods" id="ref-for-periods">periods</a> and <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$">media segments</a>. The <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$">MPD timeline</a> informs DASH clients on when it can download and present which <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$">media segments</a>. The contents of an <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$">MPD</a> are a promise by a DASH service to make specific <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$">media segments</a> <a data-link-type="dfn" href="#available" id="ref-for-available">available</a> during specific time spans described by the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$">MPD timeline</a>.</p> <p>Values on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinec$">MPD timeline</a> are all ultimately relative to the zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelined$">MPD timeline</a>, though possibly through several layers of indirection (e.g. period A is relative to period B, which is relative to the zero point).</p> <p>The ultimate purpose of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$">MPD</a> is to enable the client to obtain media samples for playback. The <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$">MPD</a> also provides the information required for a DASH client to dynamically switch between different bitrates of the same content (in different <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$">representations</a>) to adapt to changing network conditions.</p> <p>The following <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$">MPD</a> elements are most relevant to locating and scheduling the media samples:</p> <ol> <li data-md> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$">MPD</a> describes consecutive <a data-link-type="dfn" href="#periods" id="ref-for-periods`$">periods</a> which map data onto the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinee$">MPD timeline</a>.</p> <li data-md> <p>Each <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$">period</a> describes of one or more <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$">representations</a>, each of which provides media samples inside a sequence of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$">media segments</a> located via <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references">segment references</a>. <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$">Representations</a> contain independent <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$">sample timelines</a> that are mapped to the time span on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinef$">MPD timeline</a> that belongs to the <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$">period</a>.</p> <li data-md> <p><a data-link-type="dfn" href="#representations" id="ref-for-representations`$�$">Representations</a> within a <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$">period</a> are grouped into adaptation sets, which associate related <a data-link-type="dfn" href="#representations" id="ref-for-representations`$`$">representations</a> and decorate them with metadata.</p> </ol> <figure> <img src="Images/Timing/BasicMpdElements.png"> <figcaption>The primary contents of a <a data-link-type="dfn" href="#presentation" id="ref-for-presentationf$">presentation</a>, described by an <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$">MPD</a>.</figcaption> </figure> <h2 class="heading settled" data-level="7" id="timing-and-presentation-types"><span class="secno">7. </span><span class="content">Presentation timing characteristics</span><a class="self-link" href="#timing-and-presentation-types"></a></h2> <p>There exist two types of DASH <a data-link-type="dfn" href="#presentation" id="ref-for-presentationg$">presentations</a>, indicated by <code class="highlight">MPD@type</code> <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>:</p> <ul> <li data-md> <p>In a a <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="static-presentation">static presentation</dfn> (<code class="highlight">MPD@type="static"</code>) any <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$">media segment</a> may be presented at any time. The DASH client is in complete control over what content is presented when and the entire <a data-link-type="dfn" href="#presentation" id="ref-for-presentationh$">presentation</a> is <a data-link-type="dfn" href="#available" id="ref-for-available`$">available</a> at any time.</p> <li data-md> <p>In a <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="dynamic-presentation">dynamic presentation</dfn> (<code class="highlight">MPD@type="dynamic"</code>) the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineg$">MPD timeline</a> is mapped to <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock">wall clock</a> time, with each <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$">media segment</a> on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineh$">MPD timeline</a> intended to be presented at a specific moment in time (with some client-chosen <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shift">time shift</a> allowed).</p> <ul> <li data-md> <p>Furthermore, <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$">media segments</a> may become <a data-link-type="dfn" href="#available" id="ref-for-availablea$">available</a> and cease to be <a data-link-type="dfn" href="#available" id="ref-for-availableb$">available</a> with the passage of time.</p> <li data-md> <p><a href="#timing-mpd-updates">The MPD may change over time</a>, enabling the structure of the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$�$">presentation</a> to change over time (e.g. when a new title in the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$`$">presentation</a> is offered with a different set of languages).</p> </ul> </ul> <p>In a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation">dynamic presentation</a>, the zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$�$">MPD timeline</a> is the mapped to the point in <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$">wall clock</a> time indicated by the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="effective-availability-start-time">effective availability start time</dfn>, which is formed by taking <code class="highlight">MPD@availabilityStartTime</code> and applying any <code class="highlight">LeapSecondInformation</code> offset (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.5 and 5.13). This allows a <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clocka$">wall clock</a> time to be associated with each <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$">media segment</a>, indicating the moment the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$">media segment</a> is intended to be presented. The zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$`$">MPD timeline</a> will move when leap seconds occur (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.13). See also <a href="#leap-seconds">�/ 13.2 Leap seconds</a>.</p> <p><code class="highlight">MPD@mediaPresentationDuration</code> MAY be present in an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$">MPD</a>. If present, it SHALL accurately match the duration between the zero point on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$a$">MPD timeline</a> and the end of the last <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$">period</a>, including the duration of any XLink <a data-link-type="dfn" href="#periods" id="ref-for-periodse$">periods</a>. Clients SHALL calculate the total duration of a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation">static presentation</a> by adding up the durations of each <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$">period</a> and SHALL NOT rely on the presence of <code class="highlight">MPD@mediaPresentationDuration</code>.</p> <p class="note" role="note"><span>Note:</span> This calculation is necessary because the durations of XLink <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$">periods</a> can only be known after the XLink is resolved. Therefore it is impossible to always determine the total <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$">MPD</a> duration on the service side as only the client is guaranteed to have access to all the required knowledge (the contents of the XLink <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$">periods</a>).</p> <h2 class="heading settled" data-level="8" id="period-timing"><span class="secno">8. </span><span class="content">Period timing</span><a class="self-link" href="#period-timing"></a></h2> <p>An <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$">MPD</a> defines an ordered list of one or more consecutive non-overlapping <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="periods">periods</dfn> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2). A <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$">period</a> is both a time span on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$b$">MPD timeline</a> and a definition of the data to be presented during this time span. <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$">Period</a> timing is relative to the zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$c$">MPD timeline</a>, though often indirectly (being relative to the previous <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$">period</a>).</p> <figure> <img src="Images/Timing/PeriodsMakeTheMpd.png"> <figcaption>An <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$">MPD</a> defines a collection of consecutive non-overlapping <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$">periods</a>.</figcaption> </figure> <p>The start of a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$">period</a> is specified either explicitly as an offset from the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$d$">MPD timeline</a> zero point (<code class="highlight">Period@start</code>) or implicitly by the end of the previous <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$">period</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2). The duration of a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$">period</a> is specified either explicitly with <code class="highlight">Period@duration</code> or implicitly by the start point of the next <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$">period</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2). See also <a href="#timing-period-static">�/ 8.1 First and last period timing in static presentations</a> and <a href="#timing-period-dynamic">�/ 8.2 First and last period timing in dynamic presentations</a>.</p> <p><a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$">Periods</a> are self-contained - a service SHALL NOT require a client to know the contents of another <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$">period</a> in order to correctly present a <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$">period</a>. Knowledge of the contents of different periods MAY be used by a client to achieve seamless <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$">period</a> transitions, especially when working with <a href="#timing-connectivity">period-connected representations</a>.</p> <p>Common reasons for defining multiple <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$a$">periods</a> are:</p> <ul> <li data-md> <p>Assembling a presentation from multiple self-contained pieces of content.</p> <li data-md> <p>Inserting ads in the middle of existing content and/or replacing spans of existing content with ads.</p> <li data-md> <p>Adding/removing certain <a data-link-type="dfn" href="#representations" id="ref-for-representations`$a$">representations</a> as the nature of the content changes (e.g. a new title starts with a different set of offered languages).</p> <li data-md> <p>Updating period-scoped metadata (e.g. codec configuration or DRM signaling).</p> </ul> <div class="example" id="example-76dacf2c"> <a class="self-link" href="#example-76dacf2c"></a> The below <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$">MPD</a> consists of two 20-second <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$b$">periods</a>. The duration of the first <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$c$">period</a> is calculated using the start point of the second <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$d$">period</a>. The total duration of the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$a$">presentation</a> is 40 seconds. <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-> <c- e>type=</c-><c- s>"static"</c-><c- f>></c-> <c- f>&lt;Period></c-> ... <c- f>&lt;/Period></c-> <c- f>&lt;Period</c-> <c- e>start=</c-><c- s>"PT20S"</c-> <c- e>duration=</c-><c- s>"PT20S"</c-><c- f>></c-> ... <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$d$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$e$">MPD</a> file.</p> </div> <p>A <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$e$">period</a> SHALL NOT have a duration of zero. <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$f$">MPD</a> generators are expected to remove any <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$f$">periods</a> that are, for any reason, assigned a duration of zero. This might happen, for example, due to ad insertion logic deciding not to insert any ad or due to a packager not receiving any content to insert into the period. Clients SHALL ignore <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$g$">periods</a> with a duration of zero.</p> <h3 class="heading settled" data-level="8.1" id="timing-period-static"><span class="secno">8.1. </span><span class="content">First and last period timing in static presentations</span><a class="self-link" href="#timing-period-static"></a></h3> <p>In a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation`$">static presentation</a>, the first <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$h$">period</a> SHALL start at the zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$e$">MPD timeline</a> (with a <code class="highlight">Period@start</code> value of 0 seconds).</p> <p>In a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationa$">static presentation</a>, the last <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$�$">period</a> SHALL have a <code class="highlight">Period@duration</code>.</p> <h3 class="heading settled" data-level="8.2" id="timing-period-dynamic"><span class="secno">8.2. </span><span class="content">First and last period timing in dynamic presentations</span><a class="self-link" href="#timing-period-dynamic"></a></h3> <p>In a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$">dynamic presentation</a>, the first <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$`$">period</a> SHALL start at or after the zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$f$">MPD timeline</a> (with a <code class="highlight">Period@start</code> value of 0 seconds or greater).</p> <p>In a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$">dynamic presentation</a>, the last <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$a$">period</a> MAY have a <code class="highlight">Period@duration</code>, in which case it has a fixed duration. If without <code class="highlight">Period@duration</code>, the last <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$b$">period</a> in a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationb$">dynamic presentation</a> has an unlimited duration (that may later be shortened by an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$g$">MPD</a> update).</p> <p class="note" role="note"><span>Note:</span> A <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$c$">period</a> with an unlimited duration can be converted to fixed duration by an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$h$">MPD</a> update, so even a nominally unlimited duration is effectively constrained by the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration">MPD validity duration</a> of the current <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$�$">MPD</a> snapshot.</p> <div class="example" id="example-709abeb9"> <a class="self-link" href="#example-709abeb9"></a> The below <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$`$">MPD</a> consists of a 20-second <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$d$">period</a> followed by a <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$e$">period</a> of unlimited duration. <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-> <c- e>type=</c-><c- s>"dynamic"</c-><c- f>></c-> <c- f>&lt;Period</c-> <c- e>duration=</c-><c- s>"PT20S"</c-><c- f>></c-> ... <c- f>&lt;/Period></c-> <c- f>&lt;Period></c-> ... <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$a$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$b$">MPD</a> file.</p> </div> <h2 class="heading settled" data-level="9" id="representation-timing"><span class="secno">9. </span><span class="content">Representation timing</span><a class="self-link" href="#representation-timing"></a></h2> <p><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="representations">Representations</dfn> provide the content for <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$f$">periods</a>. A <a data-link-type="dfn" href="#representations" id="ref-for-representations`$b$">representation</a> is a sequence of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$">media segments</a>, an initialization segment, an optional index segment and related metadata (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.1 and 5.3.5).</p> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$c$">MPD</a> describes each <a data-link-type="dfn" href="#representations" id="ref-for-representations`$c$">representation</a> using a <code class="highlight">Representation</code> element. For each <a data-link-type="dfn" href="#representations" id="ref-for-representations`$d$">representation</a>, the <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$d$">MPD</a> defines a set of <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="segment-references">segment references</dfn> to the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$">media segments</a> and metadata describing the media samples provided by the <a data-link-type="dfn" href="#representations" id="ref-for-representations`$e$">representation</a>. The <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$">segment references</a> and much of the metadata are shared by all <a data-link-type="dfn" href="#representations" id="ref-for-representations`$f$">representations</a> in the same adaptation set.</p> <p>Each <a data-link-type="dfn" href="#representations" id="ref-for-representations`$g$">representation</a> belongs to exactly one adaptation set and exactly one <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$g$">period</a>, although <a href="#timing-connectivity">a representation may be connected with a representation in another period</a>.</p> <div class="example" id="example-d02b153e"> <a class="self-link" href="#example-d02b153e"></a> The below <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$e$">MPD</a> consists of a single 20-second <a data-link-type="dfn" href="#periods" id="ref-for-periodsb$h$">period</a> with three video, one audio and one text <a data-link-type="dfn" href="#representations" id="ref-for-representations`$h$">representation</a>. Each <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$�$">representations</a> supplies the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$�$">period</a> with 20 seconds of media samples. <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-> <c- e>type=</c-><c- s>"static"</c-><c- f>></c-> <c- f>&lt;Period</c-> <c- e>duration=</c-><c- s>"PT20S"</c-><c- f>></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation</c-> <c- e>id=</c-><c- s>"1"</c-> <c- e>mimeType=</c-><c- s>"video/mp4"</c-> <c- e>codecs=</c-><c- s>"avc1.64001f"</c-> <c- e>bandwidth=</c-><c- s>"386437"</c-> <c- f>/></c-> <c- f>&lt;Representation</c-> <c- e>id=</c-><c- s>"2"</c-> <c- e>mimeType=</c-><c- s>"video/mp4"</c-> <c- e>codecs=</c-><c- s>"avc1.640028"</c-> <c- e>bandwidth=</c-><c- s>"1117074"</c-> <c- f>/></c-> <c- f>&lt;Representation</c-> <c- e>id=</c-><c- s>"3"</c-> <c- e>mimeType=</c-><c- s>"video/mp4"</c-> <c- e>codecs=</c-><c- s>"avc1.640033"</c-> <c- e>bandwidth=</c-><c- s>"2723012"</c-> <c- f>/></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;AdaptationSet</c-> <c- e>lang=</c-><c- s>"en"</c-><c- f>></c-> <c- f>&lt;Representation</c-> <c- e>id=</c-><c- s>"4"</c-> <c- e>mimeType=</c-><c- s>"audio/mp4"</c-> <c- e>codecs=</c-><c- s>"mp4a.40.29"</c-> <c- e>bandwidth=</c-><c- s>"131351"</c-> <c- f>/></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;AdaptationSet</c-> <c- e>lang=</c-><c- s>"en-US"</c-><c- f>></c-> <c- f>&lt;Representation</c-> <c- e>id=</c-><c- s>"5"</c-> <c- e>mimeType=</c-><c- s>"application/mp4"</c-> <c- e>codecs=</c-><c- s>"wvtt"</c-> <c- e>bandwidth=</c-><c- s>"428"</c-> <c- f>/></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$f$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$g$">MPD</a> file.</p> </div> <h3 class="heading settled" data-level="9.1" id="timing-sampletimeline"><span class="secno">9.1. </span><span class="content">Sample timeline</span><a class="self-link" href="#timing-sampletimeline"></a></h3> <p>The samples within a <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$`$">representation</a> exist on a linear <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="sample-timeline">sample timeline</dfn> defined by the encoder that creates the samples. <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$">Sample timelines</a> are mapped onto the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$g$">MPD timeline</a> by metadata stored in or referenced by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpda$h$">MPD</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 7.3.2).</p> <figure> <img src="Images/Timing/TimelineAlignment.png"> <figcaption>A <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$">sample timeline</a> is mapped onto the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timeline`$h$">MPD timeline</a> based on parameters defined in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$�$">MPD</a>, relating the media samples provided by a <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$a$">representation</a> to the portion of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$�$">MPD timeline</a> covered by the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$`$">period</a> that references the <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$b$">representation</a>. The <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinec$">sample timelines</a> extend further beyond the range of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$a$">period</a> (full extents not illustrated).</figcaption> </figure> <p>The <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelined$">sample timeline</a> does not determine what samples are presented. It merely connects the timing of the <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$c$">representation</a> to the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$`$">MPD timeline</a> and allows the correct <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$">media segments</a> to be identified when a DASH client makes scheduling decisions driven by the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$a$">MPD timeline</a>. The exact connection between <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$">media segments</a> and the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinee$">sample timeline</a> is defined by the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesa$">addressing mode</a>.</p> <p>The same <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinef$">sample timeline</a> is shared by all <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$d$">representations</a> in the same adaptation set <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>. <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$e$">Representations</a> in different adaptation sets MAY use different <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineg$">sample timelines</a>.</p> <p>A <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineh$">sample timeline</a> is linear - encoders are expected to use an appropriate <a data-link-type="dfn" href="#timescale" id="ref-for-timescale">timescale</a> and sufficiently large timestamp fields to avoid any wrap-around. If wrap-around does occur, a new <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$b$">period</a> must be started in order to establish a new <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$�$">sample timeline</a>.</p> <p>The <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$`$">sample timeline</a> is formed after applying any <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> edit lists (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 7.3.2).</p> <p>A <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$a$">sample timeline</a> is measured in <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="timescale-units">timescale units</dfn> defined as a number of units per second (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.2 and 5.3.9.6). This value (the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="timescale">timescale</dfn>) SHALL be present in the MPD as <code class="highlight">SegmentTemplate@timescale</code> or <code class="highlight">SegmentBase@timescale</code> (depending on the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesb$">addressing mode</a>).</p> <p class="note" role="note"><span>Note:</span> While optional in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>, the presence of the <code class="highlight">@timescale</code> attribute is required by the interoperable timing model because the default value of 1 is unlikely to match any real-world content and is far more likely to indicate an unintentional content authoring error.</p> <figure> <img src="Images/Timing/PresentationTimeOffset.png"> <figcaption><code class="highlight">@presentationTimeOffset</code> is the key component in establishing the relationship between the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$b$">MPD timeline</a> and a <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$b$">sample timeline</a>.</figcaption> </figure> <p>The zero point of a <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$c$">sample timeline</a> may be at the start of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$c$">period</a> or at any earlier point. The point on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$d$">sample timeline</a> indicated by <code class="highlight">@presentationTimeOffset</code> is equivalent to the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$d$">period</a> start point on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$c$">MPD timeline</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.2). The value is provided by <code class="highlight">SegmentTemplate@presentationTimeOffset</code> or <code class="highlight">SegmentBase@presentationTimeOffset</code>, depending on the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesc$">addressing mode</a>, and has a default value of 0 <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-units">timescale units</a>.</p> <p class="note" role="note"><span>Note:</span> To transform a <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$e$">sample timeline</a> position <code class="highlight">SampleTime</code> to an <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$d$">MPD timeline</a> position, use the formula <code class="highlight">MpdTime = Period@start + (SampleTime - @presentationTimeOffset) / @timescale</code>.</p> <h3 class="heading settled" data-level="9.2" id="timing-segment-references"><span class="secno">9.2. </span><span class="content">Referencing media segments</span><a class="self-link" href="#timing-segment-references"></a></h3> <p>Each <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$">segment reference</a> addresses a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$">media segment</a> that corresponds to a specific time span on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$f$">sample timeline</a>.</p> <p>The exact mechanism used to define <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$">segment references</a> depends on the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesd$">addressing mode</a> used by the representation. All <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$f$">representations</a> in the same adaptation set SHALL use the same <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modese$">addressing mode</a>.</p> <p><strong class="advisement"> The sequence of <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$">segment references</a> provided for a <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$g$">representation</a> SHALL NOT leave gaps between <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$">media segments</a> or define overlapping <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$">media segments</a>.</strong></p> <p>The portion of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$e$">period</a> that a <a data-link-type="dfn" href="#representations" id="ref-for-representationsa$h$">representation</a> must provide <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$">media segments</a> for depends on the type of the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$b$">presentation</a>, with the requirements for each type described below.</p> <h4 class="heading settled" data-level="9.2.1" id="necessary-references-static"><span class="secno">9.2.1. </span><span class="content">Necessary segment references in static presentations</span><a class="self-link" href="#necessary-references-static"></a></h4> <p>In a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationb$">static presentation</a>, a <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$�$">representation</a> SHALL provide enough <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$g$">media segments</a> to cover the entire time span of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$f$">period</a>.</p> <figure> <img src="Images/Timing/StaticMpdMustBeCovered.png"> <figcaption>In a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationc$">static presentation</a>, the entire <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$g$">period</a> must be covered with <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$h$">media segments</a>.</figcaption> </figure> <h4 class="heading settled" data-level="9.2.2" id="necessary-references-dynamic"><span class="secno">9.2.2. </span><span class="content">Necessary segment references in dynamic presentations</span><a class="self-link" href="#necessary-references-dynamic"></a></h4> <p>In a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationc$">dynamic presentation</a>, a <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$`$">representation</a> SHALL provide enough <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$�$">media segments</a> to cover the time span of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsc$h$">period</a> that intersects with the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer">time shift buffer</a> at any point during the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$">MPD validity duration</a>.</p> <figure> <img src="Images/Timing/MandatorySegmentReferencesInDynamicMpd.png"> <figcaption>In a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationd$">dynamic presentation</a>, the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$">time shift buffer</a> and <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationa$">MPD validity duration</a> determine the set of required <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesd$">segment references</a> for each <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$a$">representation</a>. <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$`$">Media segments</a> filled with gray need not be referenced due to falling outside the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$">time shift buffer</a> in its maximum extents during the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationb$">MPD validity duration</a>, despite falling within the bounds of a <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$�$">period</a>.</figcaption> </figure> <p class="note" role="note"><span>Note:</span> In the above example, the second <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$`$">period</a> is shown as extending beyond the end of the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationc$">MPD validity duration</a> (e.g. because it is of unlimited length), which effectively increases the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-bufferb$">time shift buffer</a> to the end of the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationd$">MPD validity duration</a>. If the second <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$a$">period</a> were shorter, the range of required segment references would terminate with the end of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$b$">period</a>.</p> <p>It is a valid and common situation that a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$a$">media segment</a> is required to be referenced but is not yet <a data-link-type="dfn" href="#available" id="ref-for-availablec$">available</a>. See also <a href="#timing-availability">�/ 13.3 Availability</a>.</p> <h4 class="heading settled" data-level="9.2.3" id="unnecessary-segment-references"><span class="secno">9.2.3. </span><span class="content">Removal of unnecessary segment references</span><a class="self-link" href="#unnecessary-segment-references"></a></h4> <p>An <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="unnecessary-segment-reference">unnecessary segment reference</dfn> is one that is not defined as required by <a href="#necessary-references-static">�/ 9.2.1 Necessary segment references in static presentations</a> or <a href="#necessary-references-dynamic">�/ 9.2.2 Necessary segment references in dynamic presentations</a>.</p> <p>In a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationd$">static presentation</a>, the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$`$">MPD</a> SHALL NOT contain <a data-link-type="dfn" href="#unnecessary-segment-reference" id="ref-for-unnecessary-segment-reference">unnecessary segment references</a>, except for <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$b$">representations</a> that use <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressing">indexed addressing</a> in which case such <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencese$">segment references</a> MAY be present.</p> <p>In a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentatione$">dynamic presentation</a>, the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$a$">MPD</a> SHALL NOT contain <a data-link-type="dfn" href="#unnecessary-segment-reference" id="ref-for-unnecessary-segment-reference`$">unnecessary segment references</a> except when any of the following applies, in which case an <a data-link-type="dfn" href="#unnecessary-segment-reference" id="ref-for-unnecessary-segment-referencea$">unnecessary segment reference</a> MAY be present:</p> <ol> <li data-md> <p>The <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesf$">segment reference</a> is for future content and will eventually become necessary.</p> <li data-md> <p>The <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesg$">segment reference</a> is defined via <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressing`$">indexed addressing</a>.</p> <li data-md> <p>The <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesh$">segment reference</a> is defined by an <code class="highlight">&lt;S></code> element that uses <code class="highlight">S@r</code> to define multiple <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$�$">segment references</a>, some of which are necessary.</p> <li data-md> <p>Removal of the <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$`$">segment reference</a> is not allowed by <a href="#timing-mpd-updates-remove-content">content removal constraints</a>.</p> </ol> <h3 class="heading settled" data-level="9.3" id="timing-period-representation-alignment"><span class="secno">9.3. </span><span class="content">Alignment of periods and representations</span><a class="self-link" href="#timing-period-representation-alignment"></a></h3> <p><a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point">Segment start points</a> and <a data-link-type="dfn" href="#segment-end-point" id="ref-for-segment-end-point">segment end points</a> do not need to be aligned with <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$c$">period</a> start/end points (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 7.2.1). The general expectation is that only the content that falls within the <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$d$">period</a> time span is presented by DASH clients. Allowing for overflow outside this time span ensures that <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$e$">periods</a> can be easily started and ended at arbitrary positions on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$e$">MPD timeline</a> without leaving gaps. Starting and ending <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$f$">periods</a> is an editorial decision that is typically independent of the technical structure of the contents of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$g$">period</a>.</p> <figure> <img src="Images/Timing/SamplesOnPeriodBoundary.png"> <figcaption><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$b$">Media segments</a> and samples need not align with <a data-link-type="dfn" href="#periods" id="ref-for-periodsd$h$">period</a> boundaries. Some samples may be entirely outside a <a data-link-type="dfn" href="#periods" id="ref-for-periodse$�$">period</a> (marked gray) and some may overlap the <a data-link-type="dfn" href="#periods" id="ref-for-periodse$`$">period</a> boundary (yellow).</figcaption> </figure> <p>Clients SHALL NOT present any samples from <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$c$">media segments</a> that are entirely outside the <a data-link-type="dfn" href="#periods" id="ref-for-periodse$a$">period</a>, even if such <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$d$">media segments</a> are referenced.</p> <p>If a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$e$">media segment</a> overlaps a <a data-link-type="dfn" href="#periods" id="ref-for-periodse$b$">period</a> boundary, clients SHOULD NOT present the samples that lie outside the <a data-link-type="dfn" href="#periods" id="ref-for-periodse$c$">period</a> and SHOULD present the samples that lie either partially or entirely within the <a data-link-type="dfn" href="#periods" id="ref-for-periodse$d$">period</a>.</p> <p class="note" role="note"><span>Note:</span> In the end, which samples are presented is entirely up to the client. It may sometimes be impractical to present <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$f$">media segments</a> only partially, depending on the capabilities of the client platform, the type of media samples involved and any dependencies between samples.</p> <p>As perfect alignment between sample and <a data-link-type="dfn" href="#periods" id="ref-for-periodse$e$">period</a> boundaries cannot be expected, clients MAY incur small <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shift`$">time shift</a> in either direction (within extents permitted by this document) when playing a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationf$">dynamic presentation</a> and transitioning in/out of a <a data-link-type="dfn" href="#periods" id="ref-for-periodse$f$">period</a> where the sample and <a data-link-type="dfn" href="#periods" id="ref-for-periodse$g$">period</a> boundaries are not aligned.</p> <h2 class="heading settled" data-level="10" id="no-clock-drift"><span class="secno">10. </span><span class="content">Clock drift is forbidden</span><a class="self-link" href="#no-clock-drift"></a></h2> <p>Some encoders experience clock drift - they do not produce exactly 1 second worth of output per 1 second of input, either stretching or compressing the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$g$">sample timeline</a> with respect to the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$f$">MPD timeline</a>.</p> <figure> <img src="Images/Timing/ClockDrift.png"> <figcaption>Comparison of an encoder correctly tracking <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clockb$">wall clock</a> time (blue) and an encoder with a clock that runs 0.8% too slowly (yellow), leading it to producing fewer seconds of content than expected (the correct amount of content has been temporally compressed by the encoder to fit into a smaller number of seconds). A DASH packager cannot use the yellow encoder s output as-is or it would violate the DASH timing model, which requires services to track <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clockc$">wall clock</a> time, and potentially lead to track de-synchronization.</figcaption> </figure> <p>Clock drift not only causes timing model violations when an insufficient amount of data is produced but also leads to de-synchronization of content in tracks encoded based on different clocks. <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> 6.3 and 6.6.8 require tracks to be synchronized.</p> <p class="note" role="note"><span>Note:</span> A lack of data at the current <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clockd$">wall clock</a> time or in the past is typically a violation of the timing model, whereas there is no explicit restriction on providing data in the future.</p> <p>To detect clock drift, one can check for the presence/absence of data near the current <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clocke$">wall clock</a> time. If data from now or the immediate past is absent, possibly the encoder has a slow clock. If data from the future is present, possibly the encoder has a fast clock. Furthermore, gradual de-synchronization of content in different tracks over a long play duration is a clear sign of clock drift on one or more of the involved encoders.</p> <p>It would be unreasonable to expect DASH clients to counteract clock drift by performing their own timeline stretching or compressing during playback, even if provided with the information about clock differences. DASH clients are based on very limited media platform APIs that typically lack the capability for any such compensation. Therefore, a DASH service SHALL NOT publish content that suffers from clock drift.</p> <p>The solution is to adjust the encoder so that it correctly tracks <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clockf$">wall clock</a> time, e.g. by performing regular small adjustments to the encoder clock to counteract any "natural" drift it may be experiencing. The exact implementation depends on the encoder timing logic and is out of scope of this document.</p> <h3 class="heading settled" data-level="10.1" id="clock-drift-ugly-hacks"><span class="secno">10.1. </span><span class="content">Workarounds for clock drift</span><a class="self-link" href="#clock-drift-ugly-hacks"></a></h3> <p>If the encoder cannot be adjusted to not suffer from clock drift, the only remaining option is to post-process its output to bring the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$c$">presentation</a> into conformance with the timing model. The facilities available to the packager are likely less powerful than those available to the encoder - it is unlikely that re-encoding/re-timing the media samples is practical in the packager. Furthermore, this type of adjustment will not eliminate track de-synchronization that will be present unless the clocks used to encode all tracks drift at the same rate.</p> <p>DASH packagers are responsible for generating DASH <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$d$">presentations</a> that conform to targeted standards or specifications and cannot assume perfect encoder implementations. It is a fact that some encoders suffer from clock drift. DASH packagers SHOULD implement workarounds to ensure the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$e$">presentation</a> is conforming to targeted standards and specifications. This may require some some unavoidable disruption of the end-user experience.</p> <p>The following are examples of approaches a DASH packager could use to bring content from an encoder suffering clock drift into conformance:</p> <ol> <li data-md> <p>Drop a span of content if input is produced faster than real-time.</p> <li data-md> <p>Insert regular padding content if input is produced slower than real-time. This padding can take different forms:</p> <ul> <li data-md> <p>Silence or a blank picture.</p> <li data-md> <p>Repeating frames.</p> <li data-md> <p>Insertion of short-duration <a data-link-type="dfn" href="#periods" id="ref-for-periodse$h$">periods</a> where the affected <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$c$">representations</a> are not present.</p> </ul> </ol> <p>Such after-the-fact corrective actions can be disruptive and only serve as a backstop to prevent complete playback failure cased by timing model violations. Such workarounds might be satisfactory when correcting for very small drift rates, with any disruptions being relatively rare.</p> <h2 class="heading settled" data-level="11" id="timing-mediasegment"><span class="secno">11. </span><span class="content">Media segments</span><a class="self-link" href="#timing-mediasegment"></a></h2> <p>A <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="media-segment">media segment</dfn> is an HTTP-addressable data structure that contains media samples, referenced by an <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$b$">MPD</a> via a <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$a$">segment reference</a>. The structure of a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$g$">media segment</a> is that of a CMAF segment consisting of one or more CMAF fragments <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>. Different <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenta$h$">media segments</a> may be different byte ranges accessed on the same URL.</p> <p><strong class="advisement"> The segment-related terminology in this document is aligned with <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> rather than <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>. See <a href="#confusing-terms">�/ 4.3 Terminology choices in this document</a> to better understand the differences.</strong></p> <p><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$�$">Media segments</a> contain one or more consecutive media samples and consecutive <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$`$">media segments</a> in the same <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$d$">representation</a> contain consecutive media samples <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a>.</p> <p>A <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$a$">media segment</a> contains the media samples that exactly match the time span on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timeline`$h$">sample timeline</a> associated with a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$b$">media segment</a> via a <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$b$">segment reference</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 7.2.1 and <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>), except when using <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing">simple addressing</a> in which case a certain amount of inaccuracy may be present as defined in <a href="#addressing-simple-inaccuracy">�/ 18.4.1 Inaccuracy in media segment timing when using simple addressing</a>. How <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$c$">segment references</a> are defined depends on the <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesf$">addressing mode</a>.</p> <p><strong class="advisement"> All timing-related clauses in this document refer to the nominal timing described in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$c$">MPD</a> unless otherwise noted. DASH clients are expected to operate with nominal times in playback logic, even if the real values differ due to permitted amounts of inaccuracy.</strong></p> <p>The <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="segment-start-point">segment start point</dfn> is the point on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$g$">MPD timeline</a> where the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$c$">media segment</a> starts according to the <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$d$">segment reference</a> obtained from the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$d$">MPD</a>. The <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="segment-end-point">segment end point</dfn> is the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$">segment start point</a> plus the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$d$">media segment</a> duration defined by the <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$e$">segment reference</a>.</p> <p class="note" role="note"><span>Note:</span> In <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> terminology, the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointa$">segment start point</a> is often equivalent to "earliest presentation time" of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$e$">media segment</a>. However, this relation does not always hold true as "earliest presentation time" is defined in terms of media sample timing which is affected by the inaccuracy allowed under <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$">simple addressing</a>. In contrast, the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointb$">segment start point</a> is always the nominal start point and is not affected by any potential timing inaccuracy.</p> <p><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$f$">Media segments</a> in different <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$e$">representations</a> of the same adaptation set are aligned (<a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> 7.3.4 and <a data-link-type="biblio" href="#biblio-dash-cmaf">[DASH-CMAF]</a>). This means they contain media samples for the same time span on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$�$">sample timeline</a>. This is true even if using <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressinga$">simple addressing</a> with <a href="#addressing-simple-inaccuracy">inaccurate media segment timing</a>. That is, not only is the nominal timing aligned but so is the true media sample timing inside the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$g$">media segments</a>.</p> <h2 class="heading settled" data-level="12" id="timing-connectivity"><span class="secno">12. </span><span class="content">Period connectivity</span><a class="self-link" href="#timing-connectivity"></a></h2> <p>In certain circumstances content may be offered such that the contents of one adaptation set are technically compatible with the contents an adaptation set in a previous <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$�$">period</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4). Such adaptation sets are <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="period-connected">period-connected</dfn>.</p> <p>The main characteristic of connectivity is that initialization segments of <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$f$">representations</a> with matching <code class="highlight">@id</code> in <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected">period-connected</a> adaptation sets are functionally equivalent (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4). That is, the initialization segment of a <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$g$">representation</a> in one <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$">period-connected</a> adaptation set can be used to initialize playback of a <a data-link-type="dfn" href="#representations" id="ref-for-representationsb$h$">representation</a> with matching <code class="highlight">@id</code> in the other <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connecteda$">period-connected</a> adaptation set. Connectivity is typically achieved by using the same encoder to encode the content of multiple <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$`$">periods</a> using the same settings.</p> <p><strong class="advisement"> In encrypted content the content key identifier <code class="highlight">default_KID</code> is part of the initialization segment. Using a different content key breaks period connectivity that would otherwise exist due to matching codec configuration.</strong></p> <p>Adaptation sets SHALL NOT be signaled as <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectedb$">period-connected</a> if the set of <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$�$">representations</a> in them is different, even if all shared <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$`$">representations</a> remain compatible.</p> <p class="note" role="note"><span>Note:</span> The above constraint removes some ambiguity from the <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> definition, which does not explicitly state whether it is allowed to only have a subset of <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$a$">representations</a> that is connected. <a href="https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/387">GitHub #387</a></p> <p>An <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$e$">MPD</a> MAY contain unrelated <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$a$">periods</a> between <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$b$">periods</a> that contain <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectedc$">period-connected</a> adaptation sets.<a data-link-type="dfn" href="#periods" id="ref-for-periodsf$c$">Period</a> connectivity MAY be chained across any number of <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$d$">periods</a>.</p> <p><a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectedd$">Period-connected</a> adaptation sets content SHOULD be signaled in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$f$">MPD</a> as <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectede$">period-connected</a>. This signaling helps clients ensure seamless playback across <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$e$">period</a> transitions.</p> <figure> <img src="Images/Timing/PeriodConnectivity.png"> <figcaption>Adaptation sets can be signaled as <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectedf$">period-connected</a>, enabling client optimizations. Arrows on diagram indicate direction of connectivity reference (from future to past), with the implied message being "the client can use the same decoder configuration it used where the arrow points to".</figcaption> </figure> <p>The <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$`$">sample timelines</a> of <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$b$">representations</a> in <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectedg$">period-connected</a> adaptation sets MAY be discontinuous between two <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$f$">periods</a> (e.g. due to encoder clock wrap-around or skipping some content as a result of editorial decisions). See also <a href="#timing-continuity">�/ 12.2 Period continuity</a>.</p> <p>The following signaling in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$g$">MPD</a> indicates that two adaptation sets are <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connectedh$">period-connected</a> across two <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$g$">periods</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4):</p> <ul> <li data-md> <p>The adaptation set in the second <a data-link-type="dfn" href="#periods" id="ref-for-periodsf$h$">period</a> has a supplemental property descriptor with:</p> <ul> <li data-md> <p><code class="highlight">@schemeIdUri</code> set to <code class="highlight">urn:mpeg:dash:period-connectivity:2015</code>.</p> <li data-md> <p><code class="highlight">@value</code> set to the <code class="highlight">Period@id</code> of the first period.</p> </ul> </ul> <p>The <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$�$">period-connected</a> adaptation sets have the same <code class="highlight">@id</code> and the same set of <code class="highlight">Representation@id</code> values (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4).</p> <h3 class="heading settled" data-level="12.1" id="connectivity-duplicates"><span class="secno">12.1. </span><span class="content">Segment reference duplication during connected period transitions</span><a class="self-link" href="#connectivity-duplicates"></a></h3> <p>As a <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$�$">period</a> may start and/or end in the middle of a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentb$h$">media segment</a>, the same <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$�$">media segment</a> may simultaneously be referenced by two <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$`$">period-connected</a> adaptation sets, with one part of it scheduled for playback during the first <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$`$">period</a> and the other part during the second <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$a$">period</a>. This is likely to be the case when no <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$a$">sample timeline</a> discontinuity is introduced by the transition.</p> <figure> <img src="Images/Timing/SegmentOverlapOnPeriodConnectivity.png"> <figcaption>The same <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$`$">media segment</a> will often exist in two <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$b$">periods</a> at a <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$a$">period-connected</a> transition. On the diagram, this is segment 4.</figcaption> </figure> <p>Clients SHOULD NOT present a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$a$">media segment</a> twice when it occurs on both sides of a <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$c$">period</a> transition in a <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$b$">period-connected</a> adaptation set.</p> <p>Clients SHOULD ensure seamless playback of <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$c$">period-connected</a> adaptation sets in consecutive <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$d$">periods</a>. Clients unable to ensure seamless playback MAY incur some amount of <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shifta$">time shift</a> at the <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$e$">period</a> transition point provided that the resulting <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shiftb$">time shift</a> is permitted by the timing model.</p> <p class="note" role="note"><span>Note:</span> The exact mechanism that ensures seamless playback depends on client capabilities and will be implementation-specific. Any shared <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$b$">media segment</a> overlapping the <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$f$">period</a> boundary may need to be detected and deduplicated to avoid presenting it twice.</p> <h3 class="heading settled" data-level="12.2" id="timing-continuity"><span class="secno">12.2. </span><span class="content">Period continuity</span><a class="self-link" href="#timing-continuity"></a></h3> <p>In addition to <a href="#timing-connectivity">period connectivity</a>, <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4 defines <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$g$">period</a> continuity. Continuity is a special case of <a data-link-type="dfn" href="#periods" id="ref-for-periodsg$h$">period</a> connectivity that indicates no timeline discontinuity is present at the transition point between the media samples of the two continuous <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$�$">periods</a>. Under continuity conditions, the client is expected to be able to continue seamless playback by merely appending <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$c$">media segments</a> from the new <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$`$">period</a>, without any reconfiguration at the <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$a$">period</a> boundary.</p> <p>Continuity SHALL NOT be signaled if the first/last sample in the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$d$">media segment</a> on the <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$b$">period</a> boundary does not exactly start/end on the <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$c$">period</a> boundary. This cannot be expected to be generally true, as <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$d$">period</a> boundaries are often an editorial decision independent of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$e$">media segment</a> and sample layout.</p> <p class="note" role="note"><span>Note:</span> This further constrains usage of continuity compared to <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>, which does not require the boundary samples to actually be the first/last sample in the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$f$">media segment</a>. However, that interpretation leaves room for incompatible implementations depending on how the client handles <a href="#connectivity-duplicates">deduplication of duplicate segments at period boundaries</a> (which would be required under the rules of the interoperable timing model in order to not leave a gap).</p> <p><a data-link-type="dfn" href="#periods" id="ref-for-periodsh$e$">Period</a> continuity MAY be signaled in the MPD when the above condition is met, in which case period connectivity SHALL NOT be simultaneously signaled on the same <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$c$">representation</a>. Continuity implies connectivity (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4).</p> <p>The signaling of <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$f$">period</a> continuity is the same as for <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$g$">period</a> connectivity, except that the value to use for <code class="highlight">@schemeIdUri</code> is <code class="highlight">urn:mpeg:dash:period-continuity:2015</code> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.2.4).</p> <p>Clients MAY take advantage of any platform-specific optimizations for seamless playback that knowledge of <a data-link-type="dfn" href="#periods" id="ref-for-periodsh$h$">period</a> continuity enables; beyond that, clients SHALL treat continuity the same as connectivity.</p> <h2 class="heading settled" data-level="13" id="timing-dynamic"><span class="secno">13. </span><span class="content">Dynamic presentations</span><a class="self-link" href="#timing-dynamic"></a></h2> <p>The requirements in this section and its subsections only apply to <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationg$">dynamic presentations</a>.</p> <p>The following factors primarily differentiate <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationh$">dynamic presentations</a> from <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentatione$">static presentations</a>:</p> <ol> <li data-md> <p>The <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$g$">media segments</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$�$">dynamic presentation</a> may become <a data-link-type="dfn" href="#available" id="ref-for-availabled$">available</a> over time and cease to be <a data-link-type="dfn" href="#available" id="ref-for-availablee$">available</a> after the passage of time. That is, not all segments are necessarily <a data-link-type="dfn" href="#available" id="ref-for-availablef$">available</a> at all times.</p> <li data-md> <p>Playback of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$`$">dynamic presentation</a> is synchronized to a <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clockg$">wall clock</a> (with some amount of client-chosen <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shiftc$">time shift</a> allowed).</p> <li data-md> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpdb$h$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$a$">dynamic presentation</a> may change over time, with each snapshot having a limited <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duratione$">MPD validity duration</a> and clients regularly downloading new snapshots of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$�$">MPD</a>.</p> </ol> <div class="example" id="example-cd928edc"> <a class="self-link" href="#example-cd928edc"></a> The below <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$`$">MPD</a> consists of two 300-second <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$�$">periods</a>. The duration of the first <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$`$">period</a> is calculated using the start point of the second <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$a$">period</a>. The total duration of the presentation is 600 seconds. <p>The <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$b$">dynamic presentation</a> was intended to be presented starting at 09:35 UTC on December 2, 2017, allowing for up to 400 seconds of <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shiftd$">time shift</a> by the DASH client. By the absence of <code class="highlight">MPD@minimumUpdatePeriod</code>, the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$a$">MPD</a> indicates that its contents will never change.</p> <p>The absence of an <code class="highlight">LeapSecondInformation</code> element indicates the service provider does not expect the service to remain accessible for long enough to encounter a leap second.</p> <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-> <c- e>type=</c-><c- s>"dynamic"</c-> <c- e>availabilityStartTime=</c-><c- s>"2017-12-02T09:35:00Z"</c-> <c- e>timeShiftBufferDepth=</c-><c- s>"PT400S"</c-><c- f>></c-> <c- f>&lt;Period></c-> ... <c- f>&lt;/Period></c-> <c- f>&lt;Period</c-> <c- e>start=</c-><c- s>"PT300S"</c-> <c- e>duration=</c-><c- s>"PT300S"</c-><c- f>></c-> ... <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$b$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$c$">MPD</a> file.</p> <p>The requirements in this document mandate the removal of expired content and expired <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$d$">MPDs</a>. Given the 2017 date marked in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$e$">MPD</a>, this example is obviously expired in its entirety. The necessary removal of expired content from within the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$f$">MPD</a> has been omitted for purposes of illustration.</p> </div> <h3 class="heading settled" data-level="13.1" id="clock-sync"><span class="secno">13.1. </span><span class="content">Clock synchronization</span><a class="self-link" href="#clock-sync"></a></h3> <p>During playback of <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$c$">dynamic presentations</a>, a wall <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="wall-clock">wall clock</dfn> is used as the timing reference for DASH client decisions. This is a synchronized clock shared by the DASH client and service. With the exception of clock adjustments performed by the DASH client for synchronization purposes, the time indicated by the <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clockh$">wall clock</a> increases at real time speed (1 second per second), regardless of the duration of content that has been presented by the DASH client.</p> <p>It is critical to synchronize the clocks of the DASH client and service when using a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$d$">dynamic presentation</a> because the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelinea$h$">MPD timeline</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$e$">dynamic presentation</a> is mapped to <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$�$">wall clock</a> time and many playback decisions are clock driven and assume a common understanding of time by the DASH client and service.</p> <p>The time indicated by the <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$`$">wall clock</a> does not necessarily need to match some universal standard as long as the DASH client and service are mutually synchronized.</p> <p>Clock synchronization mechanisms are described by <code class="highlight">UTCTiming</code> elements in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$g$">MPD</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.8.4.11).</p> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpdc$h$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$f$">dynamic presentation</a> SHALL include at least one <code class="highlight">UTCTiming</code> element that defines a clock synchronization mechanism. If multiple <code class="highlight">UTCTiming</code> elements are listed, their order determines the order of preference <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>.</p> <p>A client presenting a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$g$">dynamic presentation</a> SHALL synchronize its local clock according to the <code class="highlight">UTCTiming</code> elements in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$�$">MPD</a> and SHALL emit a warning or error to application developers when clock synchronization fails, no <code class="highlight">UTCTiming</code> elements are defined or none of the referenced clock synchronization mechanisms are supported by the client.</p> <p>A DASH client SHALL NOT use a synchronization method that is not listed in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$`$">MPD</a> unless explicitly instructed to do so by the application developer.</p> <p><strong class="advisement"> The use of a "default time source" by DASH clients is not allowed because this often obscures interoperability problems and introduces inconsistent behavior due to device clock differences.</strong></p> <p>The set of time synchronization mechanisms SHALL be restricted to the following subset of schemes from among those defined in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.8.5.7:</p> <ul> <li data-md> <p><code class="highlight">urn:mpeg:dash:utc:http-xsdate:2014</code></p> <li data-md> <p><code class="highlight">urn:mpeg:dash:utc:http-iso:2014</code></p> <li data-md> <p><code class="highlight">urn:mpeg:dash:utc:http-head:2014</code></p> <li data-md> <p><code class="highlight">urn:mpeg:dash:utc:direct:2014</code></p> </ul> <p class="issue" id="issue-2e018246"><a class="self-link" href="#issue-2e018246"></a> We could benefit from some detailed examples here, especially as clock sync is such a critical element of live services.</p> <h3 class="heading settled" data-level="13.2" id="leap-seconds"><span class="secno">13.2. </span><span class="content">Leap seconds</span><a class="self-link" href="#leap-seconds"></a></h3> <p><a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentation`$h$">Dynamic presentations</a> that cross the boundary between December/January or June/July (<a data-link-type="biblio" href="#biblio-leap-seconds">[LEAP-SECONDS]</a>) need to correctly represent the effects of leap seconds to DASH clients, which shift the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$�$">MPD timeline</a> start point. Under the model defined by <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.13, clients are informed of necessary leap second adjustments via the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$a$">MPD</a>.</p> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$b$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$�$">dynamic presentations</a> SHALL publish leap second offset information in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$c$">MPD</a>, in the form of a <code class="highlight">LeapSecondInformation</code> element as defined by <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.13, unless the service provider does not intend for the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$f$">presentation</a> to remain accessible long enough to encounter a December/January or June/July transition in the UTC timezone.</p> <p>Clients SHALL process leap second offset information (and any updates received due to <a data-link-type="dfn" href="#mpd-refreshes" id="ref-for-mpd-refreshes">MPD refreshes</a>) in order to accurately calculate the <a data-link-type="dfn" href="#effective-availability-start-time" id="ref-for-effective-availability-start-time">effective availability start time</a>.</p> <h3 class="heading settled" data-level="13.3" id="timing-availability"><span class="secno">13.3. </span><span class="content">Availability</span><a class="self-link" href="#timing-availability"></a></h3> <p>A <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentc$h$">media segment</a> is <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="available">available</dfn> when an HTTP request to acquire the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$�$">media segment</a> can be started and successfully performed to completion by a client (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 3.1.6). During playback of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$`$">dynamic presentation</a>, new <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$`$">media segments</a> continuously become <a data-link-type="dfn" href="#available" id="ref-for-availableg$">available</a> and stop being <a data-link-type="dfn" href="#available" id="ref-for-availableh$">available</a> with the passage of time.</p> <p>An <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="availability-window">availability window</dfn> is a time span on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$`$">MPD timeline</a> that determines which <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$a$">media segments</a> clients can expect to be <a data-link-type="dfn" href="#available" id="ref-for-available`$�$">available</a>.</p> <p>Each adaptation set has its own <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-window">availability window</a>. Services SHALL NOT define <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$d$">MPD</a> attributes that affect the <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-window`$">availability window</a> on the <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$d$">representation</a> level.</p> <figure> <img src="Images/Timing/AvailabilityWindow.png"> <figcaption>The <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowa$">availability window</a> determines which <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$b$">media segments</a> can be expected to be <a data-link-type="dfn" href="#available" id="ref-for-available`$`$">available</a>, based on where their <a data-link-type="dfn" href="#segment-end-point" id="ref-for-segment-end-point`$">segment end point</a> lies.</figcaption> </figure> <p class="note" role="note"><span>Note:</span> A DASH service will typically make <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$c$">media segments</a> <a data-link-type="dfn" href="#available" id="ref-for-available`$a$">available</a> some seconds ahead of <code class="highlight">t=now</code>, depending on its configuration and latency target. Furthermore, some <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$b$">periods</a> may be entirely prepared in advance and <a data-link-type="dfn" href="#available" id="ref-for-available`$b$">available</a> at all times (e.g. ads inserted between truly live content).</p> <p>The <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowb$">availability window</a> is calculated as follows:</p> <div class="algorithm"> <ol> <li data-md> <p>Let <var>now</var> be the current wall clock time according to the <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$a$">wall clock</a>.</p> <li data-md> <p>Let <var>AvailabilityWindowStart</var> be <code class="highlight"><var>now</var> - MPD@timeShiftBufferDepth</code>.</p> <ul> <li data-md> <p>If <code class="highlight">MPD@timeShiftBufferDepth</code> is not defined, let <var>AvailabilityWindowStart</var> be the <a data-link-type="dfn" href="#effective-availability-start-time" id="ref-for-effective-availability-start-time`$">effective availability start time</a>.</p> </ul> <li data-md> <p>Let <var>TotalAvailabilityTimeOffset</var> be the sum of all <code class="highlight">@availabilityTimeOffset</code> values that apply to the adaptation set, either via <code class="highlight">SegmentBase</code>, <code class="highlight">SegmentTemplate</code> or <code class="highlight">BaseURL</code> elements (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.5.3).</p> <li data-md> <p>The <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowc$">availability window</a> is the time span from <var>AvailabilityWindowStart</var> to <code class="highlight"><var>now</var> + <var>TotalAvailabilityTimeOffset</var></code>.</p> </ol> </div> <p><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$d$">Media segments</a> that have their <a data-link-type="dfn" href="#segment-end-point" id="ref-for-segment-end-pointa$">segment end point</a> inside or at the end of the <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowd$">availability window</a> are <a data-link-type="dfn" href="#available" id="ref-for-available`$c$">available</a> <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>.</p> <p class="note" role="note"><span>Note:</span> <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 4.3 and 5.3.9 define "segment availability time" of a segment as the span of <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$b$">wall clock</a> time during which that <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$e$">media segment</a> is available. Consequently, the <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowe$">availability window</a> at each moment is <strong>approximately</strong> equivalent to the union of "segment availability times" of all <a data-link-type="dfn" href="#available" id="ref-for-available`$d$">available</a> <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$f$">media segments</a> at that moment.</p> <p><strong class="advisement"> It is the responsibility of the DASH service to ensure that <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$g$">media segments</a> are <a data-link-type="dfn" href="#available" id="ref-for-available`$e$">available</a> to clients when they are described as <a data-link-type="dfn" href="#available" id="ref-for-available`$f$">available</a> by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$e$">MPD</a> <a data-link-type="biblio" href="#biblio-dash">[DASH]</a>. Keep in mind that the criterium for availability is a successful download by clients, not successful publishing from a packager.</strong></p> <p>Clients MAY at any point attempt to acquire any <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentd$h$">media segments</a> that the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$f$">MPD</a> signals as <a data-link-type="dfn" href="#available" id="ref-for-available`$g$">available</a>. Clients SHALL NOT attempt to acquire <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$�$">media segments</a> that the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$g$">MPD</a> does not signal as <a data-link-type="dfn" href="#available" id="ref-for-available`$h$">available</a>.</p> <p>Despite best efforts, DASH services occasionally fail to achieve the <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowf$">availability windows</a> advertised in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdd$h$">MPD</a>. To ensure robust behavior even in the face of imperfect services, clients SHOULD NOT assume that <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$`$">media segments</a> described by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$�$">MPD</a> as <a data-link-type="dfn" href="#available" id="ref-for-availablea$�$">available</a> are <a data-link-type="dfn" href="#available" id="ref-for-availablea$`$">available</a> and SHOULD implement appropriate retry/fallback behavior to account for timing errors by slow-publishing or eagerly-unpublishing services.</p> <h3 class="heading settled" data-level="13.4" id="timing-timeshift"><span class="secno">13.4. </span><span class="content">Time shift buffer</span><a class="self-link" href="#timing-timeshift"></a></h3> <p>The <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="time-shift-buffer">time shift buffer</dfn> is a time span on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$a$">MPD timeline</a> that defines the set of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$a$">media segments</a> that a client is allowed to present at the current moment in time according to the <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$c$">wall clock</a> (<code class="highlight">now</code>).</p> <p>This is the mechanism by which clients can introduce a <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="time-shift">time shift</dfn> (an offset) between <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$d$">wall clock</a> time and the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$b$">MPD timeline</a> when presenting <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$a$">dynamic presentations</a>. The <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shifte$">time shift</a> is zero when a client is presenting the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$b$">media segment</a> at the end point of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-bufferc$">time shift buffer</a>. By playing back <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$c$">media segments</a> from further in the past, a positive <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shiftf$">time shift</a> is introduced.</p> <p class="note" role="note"><span>Note:</span> A <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shiftg$">time shift</a> of 30 seconds means that the client starts presenting a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$d$">media segment</a> at the moment when its position on the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$c$">MPD timeline</a> reaches a distance of 30 seconds from the end of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-bufferd$">time shift buffer</a>.</p> <p>The following additional factors further constrain the set of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$e$">media segments</a> that can be presented at the current time. These factors often force a client to introduce a <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shifth$">time shift</a>:</p> <ol> <li data-md> <p><a href="#timing-availability">�/ 13.3 Availability</a> - not every <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$f$">media segment</a> in the time shift buffer is guaranteed to be <a data-link-type="dfn" href="#available" id="ref-for-availablea$a$">available</a>.</p> <li data-md> <p><a href="#timing-delay">�/ 13.5 Presentation delay</a> - the service may define a delay that forbids the use of a section of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffere$">time shift buffer</a>.</p> </ol> <p>The <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-bufferf$">time shift buffer</a> extends from <code class="highlight">now - MPD@timeShiftBufferDepth</code> to <code class="highlight">now</code>. In the absence of <code class="highlight">MPD@timeShiftBufferDepth</code> the start of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-bufferg$">time shift buffer</a> is the <a data-link-type="dfn" href="#effective-availability-start-time" id="ref-for-effective-availability-start-timea$">effective availability start time</a>.</p> <figure> <img src="Images/Timing/TimeShiftBuffer.png"> <figcaption><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$g$">Media segments</a> overlapping the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-bufferh$">time shift buffer</a> may potentially be presented by a client if other constraints do not forbid it.</figcaption> </figure> <p>Clients MAY present samples from <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmente$h$">media segments</a> that overlap (either in full or in part) the time shift buffer, assuming no other constraints forbid it. Clients SHALL NOT present samples from <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$�$">media segments</a> that are entirely outside the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$�$">time shift buffer</a> (whether in the past or the future).</p> <p>The start of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$`$">time shift buffer</a> MAY be before the start of the first <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$c$">period</a>. Common reasons for this are:</p> <ul> <li data-md> <p>The <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$g$">presentation</a> just started and there is not enough content to fill the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$a$">time shift buffer</a>.</p> <li data-md> <p>The service is published with an effectively infinite <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$b$">time shift buffer</a> (up to the zero point of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$d$">MPD timeline</a> as indicated by the <a data-link-type="dfn" href="#effective-availability-start-time" id="ref-for-effective-availability-start-timeb$">effective availability start time</a>).</p> </ul> <p>A <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$b$">dynamic presentation</a> SHALL contain a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$d$">period</a> that ends at or overlaps the end point of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$c$">time shift buffer</a>, except when reaching <a href="#timing-mpd-updates-theend">the end of live content</a> in which case the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$e$">period</a> MAY end before the end of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$d$">time shift buffer</a>.</p> <p>Clients SHALL NOT allow seeking into regions of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$e$">time shift buffer</a> that are not covered by <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$f$">periods</a>, regardless of whether such regions are before or after the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$g$">periods</a> described by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$`$">MPD</a>.</p> <h3 class="heading settled" data-level="13.5" id="timing-delay"><span class="secno">13.5. </span><span class="content">Presentation delay</span><a class="self-link" href="#timing-delay"></a></h3> <p>There is a natural conflict between the <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowg$">availability window</a> and the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$f$">time shift buffer</a>. It is legal for a client to present <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$`$">media segments</a> as soon as they overlap the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$g$">time shift buffer</a>, yet such <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$a$">media segments</a> might not yet be <a data-link-type="dfn" href="#available" id="ref-for-availablea$b$">available</a>.</p> <p>Furthermore, the delay between <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$b$">media segments</a> entering the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffer`$h$">time shift buffer</a> and becoming <a data-link-type="dfn" href="#available" id="ref-for-availablea$c$">available</a> might be different for different <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$e$">representations</a> that use different <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$c$">media segment</a> durations. This difference may also change over time if a <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$f$">representation</a> does not use a constant <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$d$">media segment</a> duration.</p> <p>The mechanism that allows DASH clients to resolve this conflict is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="presentation-delay">presentation delay</dfn>, which decreases the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$�$">time shift buffer</a> by moving its end point into the past, creating an <a data-link-type="dfn" href="#effective-time-shift-buffer" id="ref-for-effective-time-shift-buffer">effective time shift buffer</a> with a reduced duration.</p> <p>Clients SHALL calculate a suitable <a data-link-type="dfn" href="#presentation-delay" id="ref-for-presentation-delay">presentation delay</a> to ensure that the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$e$">media segments</a> it schedules for playback are <a data-link-type="dfn" href="#available" id="ref-for-availablea$d$">available</a> and that there is sufficient time to download them once they become <a data-link-type="dfn" href="#available" id="ref-for-availablea$e$">available</a>.</p> <p class="issue" id="issue-b0845db9"><a class="self-link" href="#issue-b0845db9"></a> Can we recommend some meaningful algorithm for this? Something to use as a starting point would be nice to provide.</p> <p>The information required to calculate an optimal <a data-link-type="dfn" href="#presentation-delay" id="ref-for-presentation-delay`$">presentation delay</a> might not always be available to DASH clients (e.g. because the client is not yet aware of upcoming <a data-link-type="dfn" href="#periods" id="ref-for-periods`$�$h$">periods</a> that will be added to the <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$a$">MPD</a> later and will significantly change the optimal <a data-link-type="dfn" href="#presentation-delay" id="ref-for-presentation-delaya$">presentation delay</a>). Services MAY define the <code class="highlight">MPD@suggestedPresentationDelay</code> attribute to provide a suggested <a data-link-type="dfn" href="#presentation-delay" id="ref-for-presentation-delayb$">presentation delay</a>. Clients SHOULD use <code class="highlight">MPD@suggestedPresentationDelay</code> when provided by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$b$">MPD</a>, ignoring any calculated value.</p> <p class="note" role="note"><span>Note:</span> As different clients might use different algorithms for calculating the presentation delay, providing <code class="highlight">MPD@suggestedPresentationDelay</code> enables services to roughly synchronize the playback start position of clients.</p> <p><strong class="advisement"> A common error in DASH content authoring is to attempt to use <code class="highlight">MPD@minBufferTime</code> to control the <a data-link-type="dfn" href="#presentation-delay" id="ref-for-presentation-delayc$">presentation delay</a>. <code class="highlight">MPD@minBufferTime</code> is not related to <a data-link-type="dfn" href="#presentation-delay" id="ref-for-presentation-delayd$">presentation delay</a> and merely describes the allowed jitter in content encoding (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.5.2), as determined by the encoder or derived from the encoder configuration.</strong></p> <p>The <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="effective-time-shift-buffer">effective time shift buffer</dfn> is the time span from the start of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$`$">time shift buffer</a> to <code class="highlight">now - PresentationDelay</code>. Services SHALL NOT define a value for <code class="highlight">MPD@suggestedPresentationDelay</code> that results in an <a data-link-type="dfn" href="#effective-time-shift-buffer" id="ref-for-effective-time-shift-buffer`$">effective time shift buffer</a> of negative or zero duration.</p> <figure> <img src="Images/Timing/WindowInteractions.png"> <figcaption><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$f$">Media segments</a> that overlap the <a data-link-type="dfn" href="#effective-time-shift-buffer" id="ref-for-effective-time-shift-buffera$">effective time shift buffer</a> are the ones that may be presented at time <code class="highlight">now</code>. Two <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$g$">representations</a> with different segment lengths are shown. Diagram assumes <code class="highlight">@availabiltiyTimeOffset=0</code>.</figcaption> </figure> <p>Clients SHALL constrain seeking to the <a data-link-type="dfn" href="#effective-time-shift-buffer" id="ref-for-effective-time-shift-bufferb$">effective time shift buffer</a>. Clients SHALL NOT attempt to present <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$g$">media segments</a> that fall entirely outside the <a data-link-type="dfn" href="#effective-time-shift-buffer" id="ref-for-effective-time-shift-bufferc$">effective time shift buffer</a>.</p> <h3 class="heading settled" data-level="13.6" id="timing-mpd-updates"><span class="secno">13.6. </span><span class="content">MPD updates</span><a class="self-link" href="#timing-mpd-updates"></a></h3> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$c$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$c$">dynamic presentation</a> may change over time. The nature of the change is not restricted unless such a restriction is explicitly defined.</p> <p>Some common reasons to make changes in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$d$">MPDs</a> of <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$d$">dynamic presentations</a>:</p> <ul> <li data-md> <p>Adding new <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$f$">segment references</a> to an existing <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$�$">period</a>.</p> <li data-md> <p>Adding new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$`$">periods</a>.</p> <li data-md> <p>Converting unlimited-duration <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$a$">periods</a> to fixed-duration <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$b$">periods</a> by adding <code class="highlight">Period@duration</code>.</p> <li data-md> <p>Removing <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$g$">segment references</a> and/or <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$c$">periods</a> that have fallen out of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$a$">time shift buffer</a>.</p> <li data-md> <p>Shortening an existing <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$d$">period</a> when editorial changes in content scheduling take place.</p> <li data-md> <p>Removing <code class="highlight">MPD@minimumUpdatePeriod</code> to signal that <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$e$">MPD</a> will no longer be updated.</p> <li data-md> <p>Converting the <a data-link-type="dfn" href="#presentation" id="ref-for-presentation`$h$">presentation</a> to a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationf$">static presentation</a> to signal that a live service has become available on-demand as a recording.</p> </ul> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.4.1 defines various constraints for <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$f$">MPD</a> updates, most importantly:</p> <ul> <li data-md> <p><code class="highlight">MPD@id</code> does not change.</p> <li data-md> <p><code class="highlight">MPD.Location</code> does not change.</p> <li data-md> <p><code class="highlight">Period@id</code> does not change.</p> <li data-md> <p>The functional behavior of a <a data-link-type="dfn" href="#representations" id="ref-for-representationsc$h$">representation</a> (identified by a matching <code class="highlight">Representation@id</code> value) does not change, neither in terms of metadata-driven behavior (including metadata inherited from adaptation set level) nor in terms of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentf$h$">media segment</a> timing. In particular:</p> <ul> <li data-md> <p><code class="highlight">SegmentTemplate@presentationTimeOffset</code> does not change.</p> <li data-md> <p><code class="highlight">SegmentBase@presentationTimeOffset</code> does not change.</p> </ul> </ul> <p>DASH-IF implementation guidelines further extend these constraints:</p> <ul> <li data-md> <p><code class="highlight">MPD@availabilityStartTime</code> SHALL NOT change.</p> <ul> <li data-md> <p>Leap second adjustments are performed by adjusting the <code class="highlight">LeapSecondInformation</code> element (see <a href="#leap-seconds">�/ 13.2 Leap seconds</a>).</p> </ul> <li data-md> <p><code class="highlight">Period@start</code> SHALL NOT change.</p> <li data-md> <p><code class="highlight">Period@duration</code> SHALL NOT change except when explicitly allowed by other statements in this document.</p> <li data-md> <p><code class="highlight">AdaptationSet@id</code> SHALL be present on every <code class="highlight">AdaptationSet</code> element.</p> <li data-md> <p>The set of adaptation sets present in an existing <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$e$">period</a> (i.e. the set of <code class="highlight">AdaptationSet@id</code> values) SHALL NOT change.</p> <li data-md> <p>The relative order of <code class="highlight">AdaptationSet</code> elements in a <code class="highlight">Period</code> element SHALL NOT change.</p> <li data-md> <p>The <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$�$">representations</a> present in an existing adaptation set (i.e. the set of <code class="highlight">Representation@id</code> values) SHALL NOT change.</p> <li data-md> <p>The relative order of <code class="highlight">Representation</code> elements in an <code class="highlight">AdaptationSet</code> element SHALL NOT change.</p> </ul> <p>Additional restrictions on MPD updates are defined by other parts of this document.</p> <p>Clients SHALL use <code class="highlight">@id</code> to track <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$f$">period</a>, adaptation set and <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$`$">representation</a> identity across MPD updates (instead of relying on, for example, the order of XML elements).</p> <p>It will take some time for each <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$g$">MPD</a> update to reach clients, both due to the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationf$">MPD validity duration</a> and network connectivity influences. The constraints in this document set some limits on the data allowed to change with an <a data-link-type="dfn" href="#mpd" id="ref-for-mpde$h$">MPD</a> update in order to prevent changes in data already processed by DASH clients. Services SHOULD perform changes well in advance of the changed data being processed by clients.</p> <h4 class="heading settled" data-level="13.6.1" id="timing-mpd-mup"><span class="secno">13.6.1. </span><span class="content">MPD snapshot validity</span><a class="self-link" href="#timing-mpd-mup"></a></h4> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$�$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$e$">dynamic presentation</a> remains valid not only at its moment of initial publishing but through the entire <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="mpd-validity-duration">MPD validity duration</dfn>, which is a time span of duration <code class="highlight">MPD@minimumUpdatePeriod</code> starting from the moment the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$`$">MPD</a> download is started by a client (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.4.1).</p> <p>Validity means that the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$a$">MPD</a> remains in conformance to all requirements defined by <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> and this document. For example, any <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$b$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$f$">dynamic presentation</a> must include enough <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-references`$h$">segment references</a> to cover a time span of <code class="highlight">MPD@minimumUpdatePeriod</code> into the future, in addition to the <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$�$">segment references</a> that would ordinarily be expected at time of initial download. See also <a href="#necessary-references-dynamic">�/ 9.2.2 Necessary segment references in dynamic presentations</a>.</p> <p>Clients SHALL process state changes that occur during the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationg$">MPD validity duration</a>. For example new <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$�$">media segments</a> will become <a data-link-type="dfn" href="#available" id="ref-for-availablea$f$">available</a> over time if they are referenced by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$c$">MPD</a> and old ones become unavailable, even without downloading a new snapshot of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$d$">MPD</a>.</p> <p><strong class="advisement"> The <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-durationh$">MPD validity duration</a> starts when the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$e$">MPD</a> download is initiated by a client, which may be some time after it is generated/published!</strong></p> <p>The presence or absence of <code class="highlight">MPD@minimumUpdatePeriod</code> SHALL be used by DASH services to signal whether and when the MPD might be updated (with presence indicating potential for future updates):</p> <ul> <li data-md> <p>A nonzero value for <code class="highlight">MPD@minimumUpdatePeriod</code> defines the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$�$">MPD validity duration</a> of the present snapshot of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$f$">MPD</a>, starting from the moment its download was initiated. This allows the service to provide regular updates to the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$g$">MPD</a> while limiting the refresh interval to avoid overload.</p> <li data-md> <p>The value 0 for <code class="highlight">MPD@minimumUpdatePeriod</code> indicates that the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdf$h$">MPD</a> has no validity after the moment it is retrieved. In such a situation, the client SHALL acquire a new <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$�$">MPD</a> whenever it wants to make new <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$`$">media segments</a> available (no "natural" state changes will occur due to passage of time).</p> <li data-md> <p>Absence of the <code class="highlight">MPD@minimumUpdatePeriod</code> attribute indicates an infinite validity (the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$`$">MPD</a> will never be updated).</p> <ul> <li data-md> <p>One typical use case is to combine this with an infinite sequence of <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$`$">segment references</a>, defining a <a data-link-type="dfn" href="#presentation" id="ref-for-presentationa$�$">presentation</a> that never ends and never changes.</p> <li data-md> <p>Another use case is using a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$g$">dynamic presentation</a> to schedule the presentation of pre-prepared finite content for a specific time span of <a data-link-type="dfn" href="#wall-clock" id="ref-for-wall-clock`$e$">wall clock</a> time.</p> </ul> </ul> <h5 class="heading settled" data-level="13.6.1.1" id="timing-mpd-inband"><span class="secno">13.6.1.1. </span><span class="content">In-band MPD validity events</span><a class="self-link" href="#timing-mpd-inband"></a></h5> <p>In addition to the <code class="highlight">MPD@minimumUpdatePeriod</code> mechanism for defining the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$`$">MPD validity duration</a>, a DASH service MAY publish in-band <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$a$">MPD</a> validity update events (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.10.4.2). If a DASH client processes in-band events for determining the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$b$">MPD</a> snapshot validity duration then <code class="highlight">MPD@minimumUpdatePeriod</code> is ignored for the purposes of determining <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$c$">MPD</a> snapshot validity.</p> <p>When in-band signaling is used, the absence of an in-band event that corresponds to a particular <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$d$">MPD</a> snapshot (identified by <code class="highlight">MPD@publishTime</code>) implies <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$e$">MPD</a> snapshot validity extension until an explicit validity duration is defined by a future in-band event. This enables finer control over <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$f$">MPD</a> snapshot validity by the service but might not be supported by all clients.</p> <p class="note" role="note"><span>Note:</span> Effectively, there are two <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$g$">MPD</a> snapshot validity durations in place with in-band signaling, one defined by <code class="highlight">MPD@minimumUpdatePeriod</code> and one by in-band signaling. A DASH client may use either. DASH services are sometimes published with <code class="highlight">MPD@minimumUpdatePeriod=0</code> in such a situation, reducing the validity duration defined by one model to zero and allowing the other model to have full control. This may cause extra overhead for clients that do not use in-band signals, however.</p> <p>Services SHALL NOT require clients to support in-band events - it is an optional optimization mechanism to allow clients to reduce HTTP traffic caused by fetching new <a data-link-type="dfn" href="#mpd" id="ref-for-mpdg$h$">MPD</a> snapshots.</p> <h4 class="heading settled" data-level="13.6.2" id="timing-mpd-updates-add-content"><span class="secno">13.6.2. </span><span class="content">Adding content to the MPD</span><a class="self-link" href="#timing-mpd-updates-add-content"></a></h4> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> allows the following mechanisms for adding content:</p> <ul> <li data-md> <p>Additional <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$a$">segment references</a> may be added to the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$g$">period</a>.</p> <li data-md> <p>Additional <a data-link-type="dfn" href="#periods" id="ref-for-periods`$`$h$">periods</a> may be added to the end of the MPD.</p> </ul> <p><a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$b$">Segment references</a> SHALL NOT be added to any <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$�$">period</a> other than the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$`$">period</a>.</p> <p>An MPD update MAY combine adding <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$c$">segment references</a> to the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$a$">period</a> with adding of new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$b$">periods</a>. An <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$�$">MPD</a> update that adds content MAY be combined <a href="#timing-mpd-updates-remove-content">with an MPD update that removes content</a>.</p> <figure> <img src="Images/Timing/MpdUpdate - AddContent.png"> <figcaption><a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$`$">MPD</a> updates can add both <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$d$">segment references</a> and <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$c$">periods</a> (additions highlighted in blue).</figcaption> </figure> <p>The duration of the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$d$">period</a> cannot change as a result of adding <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$e$">segment references</a>. A live service will typically use a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$e$">period</a> with an unlimited duration to continuously add new <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$f$">segment references</a>.</p> <p>When using <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressingb$">simple addressing</a> or <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressing">explicit addressing</a>, it is possible for a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$f$">period</a> to define an infinite sequence of <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$g$">segment references</a> that extends to the end of the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$g$">period</a> (e.g. using <code class="highlight">SegmentTemplate@duration</code> or <code class="highlight">S@r="-1"</code>). Such self-extending reference sequences are equivalent to explicitly defined <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesa$h$">segment reference</a> sequences that extend to the end of the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$a$h$">period</a> and clients MAY obtain new <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$�$">segment references</a> from such sequences even between <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$a$">MPD</a> updates.</p> <h4 class="heading settled" data-level="13.6.3" id="timing-mpd-updates-remove-content"><span class="secno">13.6.3. </span><span class="content">Removing content from the MPD</span><a class="self-link" href="#timing-mpd-updates-remove-content"></a></h4> <p><a data-link-type="biblio" href="#biblio-dash">[DASH]</a> allows the following mechanisms for removing content:</p> <ul> <li data-md> <p>The last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$�$">period</a> may change from unlimited duration to fixed duration.</p> <li data-md> <p>The duration of the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$`$">period</a> may be shortened.</p> <li data-md> <p>One or more <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$a$">periods</a> may be removed entirely from the end of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$e$">MPD timeline</a>.</p> <li data-md> <p>Expired <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$b$">periods</a> and <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$`$">segment references</a> that no longer overlap the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$b$">time shift buffer</a> may be removed from the start of the <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$f$">MPD timeline</a>.</p> </ul> <p>Multiple content removal mechanisms MAY be combined in a single <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$b$">MPD</a> update. An <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$c$">MPD</a> update that removes content MAY be combined <a href="#timing-mpd-updates-add-content">with an MPD update that adds content</a>.</p> <p><strong class="advisement"> Removal of content is only allowed if the content to be removed is expired or not yet <a data-link-type="dfn" href="#available" id="ref-for-availablea$g$">available</a> to clients and guaranteed not to become <a data-link-type="dfn" href="#available" id="ref-for-availablea$h$">available</a> within the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$a$">MPD validity duration</a> of any <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$d$">MPD</a> snapshot potentially downloaded by clients.</strong></p> <p>To determine the content that may be removed, calculate <code class="highlight">EarliestRemovalPoint</code> as follows for each adaptation set:</p> <div class="algorithm"> <ol> <li data-md> <p>Let <var>PublishingDelay</var> be the end-to-end delay for <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$e$">MPD</a> update publishing. This is the time between the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$f$">MPD</a> generator creating a new version of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$g$">MPD</a> and this new version becoming published to all clients on the CDN edge (but not necessarily downloaded yet by any of them).</p> <li data-md> <p>Let <var>AvailabilityWindowEnd</var> be the end point of the <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-windowh$">availability window</a>.</p> <li data-md> <p>Let <code class="highlight">EarliestRemovalPoint</code> be <code class="highlight"><var>AvailabilityWindowEnd</var> + <code class="highlight">MPD@minimumUpdatePeriod</code> + <var>PublishingDelay</var></code>.</p> </ol> </div> <p class="note" role="note"><span>Note:</span> As each adaptation set has its own <a data-link-type="dfn" href="#availability-window" id="ref-for-availability-window`$�$">availability window</a>, so does each adaptation set have its own <code class="highlight">EarliestRemovalPoint</code>.</p> <p><a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$a$">Media segments</a> that overlap or end before <code class="highlight">EarliestRemovalPoint</code> might be considered by clients to be <a data-link-type="dfn" href="#available" id="ref-for-availableb$�$">available</a> at the time the <a data-link-type="dfn" href="#mpd" id="ref-for-mpdh$h$">MPD</a> update is processed. Therefore, an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$�$">MPD</a> update removing content SHALL NOT remove any <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$a$">segment references</a> to <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$b$">media segments</a> with a <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointc$">segment start point</a> before or at <code class="highlight">EarliestRemovalPoint</code>.</p> <figure> <img src="Images/Timing/MpdUpdate - RemoveContent.png"> <figcaption><a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$`$">MPD</a> updates can remove both <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$b$">segment references</a> and <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$c$">periods</a> (removals highlighted in red).</figcaption> </figure> <p>Perfect handling of <code class="highlight">EarliestRemovalPoint</code> by every service cannot be assumed. Clients SHALL NOT fail catastrophically if an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$a$">MPD</a> update removes already buffered data but MAY incur unexpected <a data-link-type="dfn" href="#time-shift" id="ref-for-time-shift`$�$">time shift</a> or a visible transition at the point of removal or at time of <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$b$">MPD</a> update processing. It is the responsibility of the service to avoid removing data that may already be in use.</p> <p>In addition to editorial removal from the end of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$c$">MPD</a>, content naturally expires due to the passage of time. Expired content also needs to be removed:</p> <ul> <li data-md> <p>Explicitly defined <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$c$">segment references</a> (<code class="highlight">S</code> elements) SHALL be removed when they have expired (i.e. the <a data-link-type="dfn" href="#segment-end-point" id="ref-for-segment-end-pointb$">segment end point</a> has fallen out of the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$c$">time shift buffer</a>).</p> <ul> <li data-md> <p>A repeating explicit <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$d$">segment reference</a> (<code class="highlight">S</code> element with <code class="highlight">@r != 0</code>) SHALL NOT be removed until all repetitions have expired.</p> </ul> <li data-md> <p><a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$d$">Periods</a> with their end points before the time shift buffer SHALL be removed.</p> </ul> <p>The above logic implements the removal of expired <a data-link-type="dfn" href="#unnecessary-segment-reference" id="ref-for-unnecessary-segment-referenceb$">unnecessary segment references</a> according to the rules defined in <a href="#unnecessary-segment-references">�/ 9.2.3 Removal of unnecessary segment references</a>.</p> <h4 class="heading settled" data-level="13.6.4" id="timing-mpd-updates-theend"><span class="secno">13.6.4. </span><span class="content">End of live content</span><a class="self-link" href="#timing-mpd-updates-theend"></a></h4> <p>Live services can reach a point where no more content will be produced - existing content will be played back by clients and once they reach the end, playback will cease.</p> <p>When an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$d$">MPD</a> is updated to a state that describes the final content of a live service, the service SHALL define a fixed duration for the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$e$">period</a>, remove the <code class="highlight">MPD@minimumUpdatePeriod</code> attribute and cease performing <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$e$">MPD</a> updates to signal to clients that no more content will be added to the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$f$">MPD</a>.</p> <p>Upon detecting the removal of <code class="highlight">MPD@minimumUpdatePeriod</code> clients SHOULD present a user experience suitable for end of live content.</p> <p><strong class="advisement"> A common mistake is to treat the eventual cessation of new content as a transient or fatal error (resulting in potentially infinite loading even before the final <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$c$">media segment</a> is presented to the user).</strong></p> <p>If the ending live service is to be converted to a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationg$">static presentation</a> for on-demand viewing, the service MAY change <code class="highlight">MPD@type</code> to <code class="highlight">static</code> when <code class="highlight">MPD@minimumUpdatePeriod</code> is removed or do so at a later time. The resulting <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentationh$">static presentation</a> MAY remain accessible on the same URL as the original <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationa$h$">dynamic presentation</a>. For content changes performed simultaneously with the <code class="highlight">MPD@type</code> change, the same rules apply as for regular <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$g$">MPD</a> updates of <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationb$�$">dynamic presentations</a>.</p> <p class="note" role="note"><span>Note:</span> The <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$�$h$">MPD</a> update constraints mean that making a live service available for on-demand viewing on the same URL, by transforming <code class="highlight">MPD@type</code> to <code class="highlight">static</code>, does not allow for historical (expired) content to once again become available. To enable expired content to be published on-demand, the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$�$">MPD</a> should be published on a new URL as an independent <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation`$�$">static presentation</a>.</p> <p>Clients SHALL NOT lose track of the playback position if a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationb$`$">dynamic presentation</a> becomes a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation`$`$">static presentation</a>, even if the time span of the <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation`$a$">static presentation</a> exceeds the <a data-link-type="dfn" href="#time-shift-buffer" id="ref-for-time-shift-buffera$d$">time shift buffer</a> of the <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationb$a$">dynamic presentation</a> (e.g. because the <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation`$b$">static presentation</a> includes content further into the future).</p> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$`$">MPD</a> of a <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationb$b$">dynamic presentation</a> in which all content has expired (and which is not converted to a <a data-link-type="dfn" href="#static-presentation" id="ref-for-static-presentation`$c$">static presentation</a> for on-demand viewing) SHOULD be unpublished, resulting in a 404 Not Found status when clients attempt to access the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$a$">MPD</a>.</p> <h3 class="heading settled" data-level="13.7" id="timing-mpd-refreshes"><span class="secno">13.7. </span><span class="content">MPD refreshes</span><a class="self-link" href="#timing-mpd-refreshes"></a></h3> <p>To stay informed of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$b$">MPD</a> updates, clients need to perform <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="mpd-refreshes">MPD refreshes</dfn> at appropriate moments to download the updated <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$c$">MPD</a> snapshots.</p> <p>Clients presenting <a data-link-type="dfn" href="#dynamic-presentation" id="ref-for-dynamic-presentationb$c$">dynamic presentations</a> SHALL execute the following <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$d$">MPD</a> refresh logic:</p> <ol> <li data-md> <p>When an <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$e$">MPD</a> snapshot is downloaded, it is valid for the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$b$">MPD validity duration</a> as measured from the moment the download is initiated. See <a href="#timing-mpd-mup">�/ 13.6.1 MPD snapshot validity</a>.</p> <li data-md> <p>A client can expect to be able to successfully download any <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$d$">media segments</a> that the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$f$">MPD</a> defines as <a data-link-type="dfn" href="#available" id="ref-for-availableb$`$">available</a> at any point during the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$c$">MPD validity duration</a>.</p> <li data-md> <p>The clients MAY refresh the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$g$">MPD</a> at any point. Typically this will occur because the client wants to obtain more <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$e$">segment references</a> or make more <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$e$">media segments</a> (for which it might already have references) <a data-link-type="dfn" href="#available" id="ref-for-availableb$a$">available</a> by extending the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$d$">MPD validity duration</a>.</p> <ul> <li data-md> <p>This may result in a different <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$`$h$">MPD</a> snapshot being downloaded, with updated information.</p> <li data-md> <p>Or it may be that the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$�$">MPD</a> has not changed, in which case its <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$e$">MPD validity duration</a> is extended to <code class="highlight">DownloadStart + MPD@minimumUpdatePeriod</code>.</p> </ul> </ol> <p class="note" role="note"><span>Note:</span> There is no requirement that clients poll for updates at <code class="highlight">MPD@minimumUpdatePeriod</code> interval. They can do so as often or as rarely as they wish - this attribute simply defines the <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$f$">MPD validity duration</a>.</p> <h4 class="heading settled" data-level="13.7.1" id="conditional-mpd-downloads"><span class="secno">13.7.1. </span><span class="content">Conditional MPD downloads</span><a class="self-link" href="#conditional-mpd-downloads"></a></h4> <p>It can often be the case that a live service signals a short <a data-link-type="dfn" href="#mpd-validity-duration" id="ref-for-mpd-validity-duration`$g$">MPD validity duration</a> to allow for the possibility of terminating the last <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$f$">period</a> with minimal end-to-end latency. At the same time, generating future <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$f$">segment references</a> might not require any additional information to be obtained by clients. That is, a situation might occur where constant <a data-link-type="dfn" href="#mpd-refreshes" id="ref-for-mpd-refreshes`$">MPD refreshes</a> are required but the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$`$">MPD</a> content rarely changes.</p> <p>Clients using HTTP to perform <a data-link-type="dfn" href="#mpd-refreshes" id="ref-for-mpd-refreshesa$">MPD refreshes</a> SHOULD use conditional GET requests as specified in <a data-link-type="biblio" href="#biblio-rfc7232">[RFC7232]</a> to avoid unnecessary data transfers when the contents of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$a$">MPD</a> do not change between refreshes.</p> <h2 class="heading settled" data-level="14" id="missing-segments"><span class="secno">14. </span><span class="content">Segment loss handling</span><a class="self-link" href="#missing-segments"></a></h2> <p>Due to network or other faults, it is possible that <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$f$">media segments</a> do not reach the DASH packager, effectively creating a discontinuity in a <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$a$">representation</a>. As DASH clients typically have difficulties processing content with gaps and the timing model described here forbids gaps in general, missing segments would likely lead to an unsatisfactory playback experience for end-users.</p> <figure> <img src="Images/Timing/MissingSegment.png"> <figcaption>A DASH packager might not have every <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$g$">media segment</a> available when it needs to publish them. Corrective actions must be taken to ensure an uninterrupted timeline is presented to DASH clients.</figcaption> </figure> <p>Therefore, DASH services SHALL NOT publish <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$g$">periods</a> that have missing segments, whether the segment loss is described by "missing content segments" (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 6.2.6) or by any other means (including not describing it).</p> <figure> <img src="Images/Timing/MissingSegment-FixWithPeriodSplitting.png"> <figcaption>The simplest correction is to start a new period that does not include the affected <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$b$">representation</a> for the duration of the loss. Other <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$c$">representations</a> remain present and a client can often continue seamless playback without the missing <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$d$">representation</a>.</figcaption> </figure> <p>Instead, DASH services SHOULD start a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$b$h$">period</a> that does not include the <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$e$">representation</a> that would experience a gap, later restoring the <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$f$">representation</a> with a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$�$">period</a> transition. <a href="#timing-connectivity">Period-connected adptation sets</a> can enable DASH clients to perform such transitions seamlessly in some scenarios.</p> <figure> <img src="Images/Timing/MissingSegment-FixWithPlaceholder.png"> <figcaption>Other solutions might involve replacing the missing <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmentg$h$">media segment</a> with a placeholder, either from a different <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$g$">representation</a> or an entirely artificial one.</figcaption> </figure> <p><strong class="advisement"> Some DASH clients experience difficulties when transitioning to/from a very short period (e.g. with a duration of only 1 <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$�$">media segment</a>). Implementations MAY extend the transition <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$`$">period</a> for better compatibility with such clients.</strong></p> <p>Alternatively, given a sufficiently capable DASH packager and provided that technical constraints of <a data-link-type="dfn" href="#representations" id="ref-for-representationsd$h$">representations</a> are satisfied, the missing <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$`$">media segment</a> MAY be replaced with an aligned <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$a$">media segment</a> from a lower bitrate (likely requires a single initialization CMAF switching set <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> 7.3.4.2).</p> <h2 class="heading settled" data-level="15" id="standalone-text-timing"><span class="secno">15. </span><span class="content">Timing of stand-alone IMSC1 and WebVTT text files</span><a class="self-link" href="#standalone-text-timing"></a></h2> <p>Some services store text adaptation sets in stand-alone IMSC1 or WebVTT files, without segmentation or <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> encapsulation.</p> <p class="note" role="note"><span>Note:</span> Storing text tracks in stand-alone files is not permitted by <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a>. If you intend your DASH service to conform to <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a>, you must store text tracks as segmented <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a> tracks.</p> <p>Timecodes in stand-alone text files SHALL be relative to the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$a$">period</a> start point.</p> <p><code class="highlight">@presentationTimeOffset</code> SHALL NOT be present and SHALL be ignored by clients if present.</p> <div class="example" id="example-aab5be79"> <a class="self-link" href="#example-aab5be79"></a> IMSC1 subtitles in stored in a stand-alone XML file. <pre class="highlight"><c- f>&lt;AdaptationSet</c-> <c- e>mimeType=</c-><c- s>"application/ttml+xml"</c-> <c- e>lang=</c-><c- s>"en-US"</c-><c- f>></c-> <c- f>&lt;Role</c-> <c- e>schemeIdUri=</c-><c- s>"urn:mpeg:dash:role:2011"</c-> <c- e>value=</c-><c- s>"subtitle"</c-> <c- f>/></c-> <c- f>&lt;Representation></c-> <c- f>&lt;BaseURL></c->subtitles_en_us.xml<c- f>&lt;/BaseURL></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$b$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <code class="highlight">AdaptationSet</code> element.</p> </div> <h2 class="heading settled" data-level="16" id="timing-nonos"><span class="secno">16. </span><span class="content">Forbidden techniques</span><a class="self-link" href="#timing-nonos"></a></h2> <p>Some aspects of <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> are not compatible with the interoperable timing model defined in this document. In the interest of clarity, they are explicitly listed here:</p> <ul> <li data-md> <p>The <code class="highlight">@presentationDuration</code> attribute SHALL NOT be used. This information serves no purpose under the interoperable timing model.</p> <li data-md> <p>The <code class="highlight">@availabilityTimeComplete</code> attribute SHALL NOT be used. The concept of "incomplete but available" <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$b$">media segments</a> that this attribute enables is not part of the interoperable timing model.</p> <li data-md> <p>There SHALL NOT be "missing content segments" (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 6.2.6) in the content. If content is lost during processing, the expectation is that the encoder/packager will either replace it with valid content (e.g. content from a lower representation or potentially even blank picture or silent audio) or start a new period that does not contain the <a data-link-type="dfn" href="#representations" id="ref-for-representationse$�$">representation</a> that incurs data loss.</p> </ul> <h2 class="heading settled" data-level="17" id="timing-examples"><span class="secno">17. </span><span class="content">Examples</span><a class="self-link" href="#timing-examples"></a></h2> <p>This section is informative.</p> <h3 class="heading settled" data-level="17.1" id="timing-examples-not-same-length"><span class="secno">17.1. </span><span class="content">Offer content with imperfectly aligned tracks</span><a class="self-link" href="#timing-examples-not-same-length"></a></h3> <p>It may be that for various content processing workflow reasons, some tracks have a different duration from others. For example, the audio track might start a fraction of a second before the video track and end some time before the video track ends.</p> <figure> <img src="Images/Timing/NonequalLengthTracks - Initial.png"> <figcaption>Content with different track lengths, before packaging as DASH.</figcaption> </figure> <p>You now have some choices to make in how you package these tracks into a DASH presentation that conforms to this document. Specifically, there exists the requirement that every <a data-link-type="dfn" href="#representations" id="ref-for-representationse$`$">representation</a> must cover the entire <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$b$">period</a> with media samples.</p> <figure> <img src="Images/Timing/NonequalLengthTracks - CutEverything.png"> <figcaption>Content may be cut (indicated in black) to equalize track lengths.</figcaption> </figure> <p>The simplest option is to define a single <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$c$">period</a> that contains <a data-link-type="dfn" href="#representations" id="ref-for-representationse$a$">representations</a> resulting from cutting the content to match the shortest common time span, thereby covering the entire <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$d$">period</a> with samples. Depending on the nature of the data that is removed, this may or may not be acceptable.</p> <figure> <img src="Images/Timing/NonequalLengthTracks - PadEverything.png"> <figcaption>Content may be padded (indicated in green) to equalize track lengths.</figcaption> </figure> <p>If you wish to preserve track contents in their entirety, the most interoperable option is to add padding samples (e.g. silence or black frames) to all tracks to ensure that all <a data-link-type="dfn" href="#representations" id="ref-for-representationse$b$">representations</a> have enough data to cover the entire <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$e$">period</a> with samples. This may require customization of the encoding process, as the padding must match the codec configuration of the real content and might be impractical to add after the real content has already been encoded.</p> <figure> <img src="Images/Timing/NonequalLengthTracks - MakePeriods.png"> <figcaption>New <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$f$">periods</a> may be started at any change in the set of available tracks.</figcaption> </figure> <p>Another option that preserves track contents is to <a href="#timing-examples-splitperiod">split the content</a> into multiple <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$g$">periods</a> that each contain a different set of <a data-link-type="dfn" href="#representations" id="ref-for-representationse$c$">representations</a>, starting a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$c$h$">period</a> whenever a track starts or ends. This enables you to ensure every <a data-link-type="dfn" href="#representations" id="ref-for-representationse$d$">representations</a> covers its <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$�$">period</a> with samples. The upside of this approach is that it can be done easily, requiring only manipulation of the MPD. The downside is that some clients may be unable to seamlessly play across every <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$`$">period</a> transition.</p> <figure> <img src="Images/Timing/NonequalLengthTracks - Mix.png"> <figcaption>You may combine the different approaches, cutting in some places (black), padding in others (green) and defining multiple <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$a$">periods</a> as needed.</figcaption> </figure> <p>You may wish to combine the different approaches, depending on the track, to achieve the optimal result.</p> <p>Some clients are known to fail when transitioning from a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$b$">period</a> with audio and video to a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$c$">period</a> with only one of these components. You should avoid such transitions unless you have exact knowledge of the capabilities of your clients.</p> <h3 class="heading settled" data-level="17.2" id="timing-examples-splitperiod"><span class="secno">17.2. </span><span class="content">Split a period</span><a class="self-link" href="#timing-examples-splitperiod"></a></h3> <p>There exist scenarios where you would wish to split a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$d$">period</a> in two. Common reasons would be:</p> <ul> <li data-md> <p>to insert an ad <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$e$">period</a> in the middle of an existing <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$f$">period</a>.</p> <li data-md> <p>parameters of one adaptation set change (e.g. KID or display aspect ratio), requiring a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$g$">period</a> to update signaling.</p> <li data-md> <p>some adaptation sets become available or unavailable (e.g. different languages).</p> </ul> <p>This example shows how an existing <a data-link-type="dfn" href="#periods" id="ref-for-periods`$d$h$">period</a> can be split in a way that clients capable of <a href="#timing-connectivity">seamless period-connected playback</a> do not experience interruptions in playback among <a data-link-type="dfn" href="#representations" id="ref-for-representationse$e$">representations</a> that are present both before and after the split.</p> <p>Our starting point is a presentation with a single <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$�$">period</a> that contains an audio <a data-link-type="dfn" href="#representations" id="ref-for-representationse$f$">representation</a> with short samples and a video <a data-link-type="dfn" href="#representations" id="ref-for-representationse$g$">representation</a> with slightly longer samples, so that <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$c$">media segment</a> start points do not always overlap.</p> <figure> <img src="Images/Timing/SplitInTwoPeriods - Before.png"> <figcaption>Presentation with one period, before splitting. Blue is a segment, yellow is a sample. Duration in arbitrary units is listed on samples. Segment durations are taken to be the sum of sample durations. <code class="highlight">presentationTimeOffset</code> may have any value - it is listed because will be referenced later.</figcaption> </figure> <p class="note" role="note"><span>Note:</span> <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$`$">Periods</a> may be split at any point in time as long as both sides of the split remain in conformance to this document (e.g. each contains at least 1 <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$d$">media segment</a>). Furthermore, <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$a$">period</a> splitting does not require manipulation of the segments themselves, only manipulation of the MPD.</p> <p>Let s split this <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$b$">period</a> at position 220. This split occurs during segment 3 for both <a data-link-type="dfn" href="#representations" id="ref-for-representationse$h$">representations</a> and during sample 8 and sample 5 of the audio and video <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$�$">representation</a>, respectively.</p> <p>The mechanism that enables <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$c$">period</a> splitting in the middle of a segment is the following:</p> <ul> <li data-md> <p>a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$e$">media segment</a> that overlaps a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$d$">period</a> boundary exists in both <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$e$">periods</a>.</p> <li data-md> <p><a data-link-type="dfn" href="#representations" id="ref-for-representationsf$`$">representations</a> that are split are signaled in the MPD as <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$d$">period-connected</a>.</p> <li data-md> <p>a representation that is <a data-link-type="dfn" href="#period-connected" id="ref-for-period-connected`$e$">period-connected</a> with a representation in a previous <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$f$">period</a> <a href="#timing-connectivity">is marked with the period connectivity descriptor</a>.</p> <li data-md> <p>clients are expected to deduplicate boundary-overlapping <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$f$">media segments</a> for <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$a$">representations</a> on which <a href="#timing-connectivity">period connectivity</a> is signaled, if necessary for seamless playback (implementation-specific).</p> <li data-md> <p>clients are expected to present only the samples that are within the bounds of the current <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$g$">period</a> (may be limited by client platform capabilities).</p> </ul> <p>After splitting the example presentation, we arrive at the following structure.</p> <figure> <img src="Images/Timing/SplitInTwoPeriods - After.png"> <figcaption>Presentation with two <a data-link-type="dfn" href="#periods" id="ref-for-periods`$e$h$">periods</a>, after splitting. Audio segment 3 and video segment 3 are shared by both <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$�$">periods</a>, with the connectivity signaling indicating that seamless playback with de-duplicating behavior is expected from clients.</figcaption> </figure> <p>If <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressinga$">indexed addressing</a> is used, both <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$`$">periods</a> will reference all segments as both <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$a$">periods</a> will use the same unmodified index segment. Clients are expected to ignore <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$g$">media segments</a> that fall outside the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$b$">period</a> bounds.</p> <p><strong class="advisement"> <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressingc$">Simple addressing</a> has significant limitations on alignment at <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$c$">period</a> start, making it typically unsuitable for some multi-period scenarios. See <a href="#addressing-simple-startpoint">�/ 18.4.2 Moving the period start point (simple addressing)</a>.</strong></p> <p>Other <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$d$">periods</a> (e.g. ads) may be inserted between the two <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$e$">periods</a> resulting from the split. This does not affect the addressing and timing of the two <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$f$">periods</a>.</p> <h3 class="heading settled" data-level="17.3" id="timing-examples-defaultkid"><span class="secno">17.3. </span><span class="content">Change the default_KID</span><a class="self-link" href="#timing-examples-defaultkid"></a></h3> <p>In encrypted content, the <code class="highlight">default_KID</code> of a <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$b$">representation</a> might need to be changed at certain points in time. Often, the changes are closely synchronized in different <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$c$">representations</a>.</p> <p>To perform the <code class="highlight">default_KID</code> change, start a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$g$">period</a> on every change, treating each <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$d$">representation</a> as an independently changing element. With proper signaling, clients can perform this change seamlessly.</p> <figure> <img src="Images/Timing/KID change.png"> <figcaption>A change in <code class="highlight">default_KID</code> starts a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$f$h$">period</a>. Orange indicates audio and yellow video <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$e$">representation</a>.</figcaption> </figure> <p>The same pattern can also be applied to other changes in <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$f$">representation</a> configuration.</p> <h2 class="heading settled" data-level="18" id="addressing"><span class="secno">18. </span><span class="content">Segment addressing modes</span><a class="self-link" href="#addressing"></a></h2> <p>This section defines the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="addressing-modes">addressing modes</dfn> that can be used for referencing <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segmenth$h$">media segments</a>, initialization segments and index segments in interopreable DASH presentations.</p> <p><a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesg$">Addressing modes</a> not defined in this chapter SHALL NOT be used by DASH services. Clients SHOULD support all <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modesh$">addressing modes</a> defined in this chapter.</p> <p>All <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$g$">representations</a> in the same adaptation set SHALL use the same <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modes`$�$">addressing mode</a>. <a data-link-type="dfn" href="#representations" id="ref-for-representationsf$h$">Representations</a> in different adaptation sets MAY use different <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modes`$`$">addressing modes</a>. <a href="#timing-connectivity">Period-connected representations</a> SHALL use the same <a data-link-type="dfn" href="#addressing-modes" id="ref-for-addressing-modes`$a$">addressing mode</a> in every <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$�$">period</a>.</p> <p>You SHOULD choose the addressing mode based on the nature of the content:</p> <dl class="switch"> <dt data-md>Content generated on the fly <dd data-md> <p>Use <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressing`$">explicit addressing</a>.</p> <dt data-md>Content generated in advance of publishing <dd data-md> <p>Use <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressingb$">indexed addressing</a> or <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressinga$">explicit addressing</a>.</p> </dl> <p>A service MAY use <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressingd$">simple addressing</a> which enables the packager logic to be very simple. This simplicity comes at a cost of reduced applicability to multi-period scenarios and reduced client compatibility.</p> <p><a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressingc$">Indexed addressing</a> enables all data associated with a single <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$�$">representation</a> to be stored in a single CMAF track file from which byte ranges are served to clients to supply <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$�$">media segments</a>, the initialization segment and the index segment. This gives it some unique advantages:</p> <ul> <li data-md> <p>A single large file is more efficient to transfer and cache than 100 000 or more small files, reducing computational and I/O overhead.</p> <li data-md> <p>CDNs are aware of the nature of byte-range requests and can preemptively read-ahead to fill the cache ahead of playback.</p> </ul> <h3 class="heading settled" data-level="18.1" id="addressing-indexed"><span class="secno">18.1. </span><span class="content">Indexed addressing</span><a class="self-link" href="#addressing-indexed"></a></h3> <p>A representation that uses <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="indexed-addressing">indexed addressing</dfn> consists of a CMAF track file containing an index segment, an initialization segment and a sequence of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$`$">media segments</a>.</p> <p class="note" role="note"><span>Note:</span> This addressing mode is sometimes called "SegmentBase" in other documents.</p> <p>Clauses in section only apply to <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$`$">representations</a> that use <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressingd$">indexed addressing</a>.</p> <p class="note" role="note"><span>Note:</span> <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> makes a distinction between "segment" (HTTP-addressable entity) and "subsegment" (byte range of an HTTP-addressable entity). This document does not make such a distinction and has no concept of subsegments. Usage of "segment" here matches the definition of CMAF segment <a data-link-type="biblio" href="#biblio-cmaf">[CMAF]</a>.</p> <figure> <img src="Images/Timing/IndexedAddressing.png"> <figcaption><a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressinge$">Indexed addressing</a> is based on an index segment that references all <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$a$">media segments</a>.</figcaption> </figure> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$c$">MPD</a> defines the byte range in the CMAF track file that contains the index segment. The index segment informs the client of all the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$b$">media segments</a> that exist, the time spans they cover on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$b$">sample timeline</a> and their byte ranges.</p> <p>Multiple <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$a$">representations</a> SHALL NOT be stored in the same CMAF track file (i.e. no multiplexed <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$b$">representations</a> are to be used).</p> <p>At least one <code class="highlight">Representation/BaseURL</code> element SHALL be present in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$d$">MPD</a>, containing a URL pointing to the CMAF track file.</p> <p>The <code class="highlight">SegmentBase@indexRange</code> attribute SHALL be present in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$e$">MPD</a>. The value of this attribute identifies the byte range of the index segment in the CMAF track file (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.2). The value is a <code class="highlight">byte-range-spec</code> as defined in <a data-link-type="biblio" href="#biblio-rfc7233">[RFC7233]</a>, referencing a single range of bytes.</p> <p>The <code class="highlight">SegmentBase@timescale</code> attribute SHALL be present and its value SHALL match the value of the <code class="highlight">timescale</code> field in the index segment (in the <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> <code class="highlight">sidx</code> box) and the value of the <code class="highlight">timescale</code> field in the initialization segment (in the <code class="highlight">tkhd</code> box <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a>).</p> <p>The <code class="highlight">SegmentBase/Initialization@range</code> attribute SHALL identify the byte range of the initialization segment in the CMAF track file. The value is a <code class="highlight">byte-range-spec</code> as defined in <a data-link-type="biblio" href="#biblio-rfc7233">[RFC7233]</a>, referencing a single range of bytes. The <code class="highlight">Initialization@sourceURL</code> attribute SHALL NOT be used.</p> <div class="example" id="example-14cd39d5"> <a class="self-link" href="#example-14cd39d5"></a> Below is an example of common usage of <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressingf$">indexed addressing</a>. <p>The example defines a <a data-link-type="dfn" href="#timescale" id="ref-for-timescale`$">timescale</a> of 48000 units per second, with the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$`$">period</a> starting at position 8100 (or 0.16875 seconds) on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$c$">sample timeline</a>. The client can use the index segment referenced by <code class="highlight">indexRange</code> to determine where the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$c$">media segment</a> containing position 8100 (and all other <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$d$">media segments</a>) can be found. The byte range of the initialization segment is also provided.</p> <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-><c- f>></c-> <c- f>&lt;Period></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation></c-> <c- f>&lt;BaseURL></c->showreel_audio_dashinit.mp4<c- f>&lt;/BaseURL></c-> <c- f>&lt;SegmentBase</c-> <c- e>timescale=</c-><c- s>"48000"</c-> <c- e>presentationTimeOffset=</c-><c- s>"8100"</c-> <c- e>indexRange=</c-><c- s>"848-999"</c-><c- f>></c-> <c- f>&lt;Initialization</c-> <c- e>range=</c-><c- s>"0-847"</c-><c- f>/></c-> <c- f>&lt;/SegmentBase></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$f$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$g$">MPD</a> file.</p> </div> <h3 class="heading settled" data-level="18.2" id="addressing-indexed-indexstructure"><span class="secno">18.2. </span><span class="content">Structure of the index segment</span><a class="self-link" href="#addressing-indexed-indexstructure"></a></h3> <p>The index segment SHALL consist of a single Segment Index Box (<code class="highlight">sidx</code>) as defined by <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a>. The field layout of this data structure is as follows:</p> <pre class="highlight">aligned(8) class SegmentIndexBox extends FullBox('sidx', version, 0) { unsigned int(32) reference_ID; unsigned int(32) timescale; if (version==0) { unsigned int(32) earliest_presentation_time; unsigned int(32) first_offset; } else { unsigned int(64) earliest_presentation_time; unsigned int(64) first_offset; } unsigned int(16) reserved = 0; unsigned int(16) reference_count; for (i = 1; i &lt;= reference_count; i++) { bit (1) reference_type; unsigned int(31) referenced_size; unsigned int(32) subsegment_duration; bit(1) starts_with_SAP; unsigned int(3) SAP_type; unsigned int(28) SAP_delta_time; } } </pre> <p>The values of the fields SHOULD be determined as follows:</p> <p class="note" role="note"><span>Note:</span> The normative definitions of the fields are provided by <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a>. This document describes how to determine the correct values, relating the fields to DASH specific concepts.</p> <dl> <dt data-md><code class="highlight">reference_ID</code> <dd data-md> <p>The <code class="highlight">track_ID</code> of the <a data-link-type="biblio" href="#biblio-isobmff">[ISOBMFF]</a> track that contains the data of this <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$c$">representation</a>.</p> <dt data-md><code class="highlight">timescale</code> <dd data-md> <p>Same as the <code class="highlight">timescale</code> field of the Media Header Box and same as the <code class="highlight">SegmentBase@timescale</code> attribute in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$a$h$">MPD</a>.</p> <dt data-md><code class="highlight">earliest_presentation_time</code> <dd data-md> <p>The start timestamp of the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$e$">media segment</a> on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$d$">sample timeline</a>, in <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-units`$">timescale units</a>.</p> <dt data-md><code class="highlight">first_offset</code> <dd data-md> <p>Distance from the end of the index segment to the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$f$">media segment</a>, in bytes. For example, 0 indicates that the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$g$">media segment</a> immediately follows the index segment.</p> <dt data-md><code class="highlight">reference_count</code> <dd data-md> <p>Total number of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$�$h$">media segments</a> referenced by the index segment.</p> <dt data-md><code class="highlight">reference_type</code> <dd data-md> <p><code class="highlight">0</code></p> <dt data-md><code class="highlight">referenced_size</code> <dd data-md> <p>Size of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$�$">media segment</a> in bytes. <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$`$">Media segments</a> are assumed to be consecutive, so this is also the distance to the start of the next <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$a$">media segment</a>.</p> <dt data-md><code class="highlight">subsegment_duration</code> <dd data-md> <p>Duration of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$b$">media segment</a> in <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitsa$">timescale units</a>.</p> <dt data-md><code class="highlight">starts_with_SAP</code> <dd data-md> <p><code class="highlight">1</code></p> <dt data-md><code class="highlight">SAP_type</code> <dd data-md> <p>Either <code class="highlight">1</code> or <code class="highlight">2</code>, depending on the sample structure in the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$c$">media segment</a>.</p> <dt data-md><code class="highlight">SAP_delta_time</code> <dd data-md> <p><code class="highlight">0</code></p> </dl> <p class="issue" id="issue-2b342bfc"><a class="self-link" href="#issue-2b342bfc"></a> We need to clarify how to determine the right value for <code class="highlight">SAP_type</code> <a href="https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/235">GitHub #235</a>.</p> <h4 class="heading settled" data-level="18.2.1" id="addressing-indexed-startpoint"><span class="secno">18.2.1. </span><span class="content">Moving the period start point (indexed addressing)</span><a class="self-link" href="#addressing-indexed-startpoint"></a></h4> <p>When splitting <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$a$">periods</a> in two or performing other types of editorial timing adjustments, a service might want to start a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$b$">period</a> at a point after the "natural" start point of the <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$d$">representations</a> within.</p> <p>For <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$e$">representations</a> that use <a data-link-type="dfn" href="#indexed-addressing" id="ref-for-indexed-addressingg$">indexed addressing</a>, perform the following adjustments to set a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$c$">period</a> start point:</p> <ol> <li data-md> <p>Update <code class="highlight">SegmentBase@presentationTimeOffset</code> to indicate the desired start point on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$e$">sample timeline</a>.</p> <li data-md> <p>Update <code class="highlight">Period@duration</code> to match the new duration.</p> </ol> <h3 class="heading settled" data-level="18.3" id="addressing-explicit"><span class="secno">18.3. </span><span class="content">Explicit addressing</span><a class="self-link" href="#addressing-explicit"></a></h3> <p>A <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$f$">representation</a> that uses <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="explicit-addressing">explicit addressing</dfn> consists of a set of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$d$">media segments</a> accessed via URLs constructed using a template defined in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$�$">MPD</a>, with the exact <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$f$">sample timeline</a> time span covered by the samples in each <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$e$">media segment</a> described in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$`$">MPD</a>.</p> <p class="note" role="note"><span>Note:</span> This addressing mode is sometimes called "SegmentTemplate with SegmentTimeline" in other documents.</p> <p>Clauses in section only apply to <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$g$">representations</a> that use <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressingb$">explicit addressing</a>.</p> <figure> <img src="Images/Timing/ExplicitAddressing.png"> <figcaption><a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressingc$">Explicit addressing</a> uses a segment template that is combined with explicitly defined time spans for each <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$f$">media segment</a> in order to reference <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$g$">media segments</a>, either by start time or by sequence number.</figcaption> </figure> <p>The <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$a$">MPD</a> SHALL contain a <code class="highlight">SegmentTemplate/SegmentTimeline</code> element, containing a set of <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$g$">segment references</a> that satisfies the requirements defined in this document. The <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesb$h$">segment references</a> exist as a sequence of <code class="highlight">S</code> elements, each of which references one or more <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$`$h$">media segments</a> with start time <code class="highlight">S@t</code> and duration <code class="highlight">S@d</code> <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitsb$">timescale units</a> on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$g$">sample timeline</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.6). The <code class="highlight">SegmentTemplate@duration</code> attribute is not present (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.2).</p> <p>To enable concise <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$�$">segment reference</a> definitions, an <code class="highlight">S</code> element may represent a repeating <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$`$">segment reference</a> that indicates a number of repeated consecutive <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$�$">media segments</a> with the same duration. The value of <code class="highlight">S@r</code> indicates the number of additional consecutive <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$`$">media segments</a> that exist (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.6).</p> <p class="note" role="note"><span>Note:</span> Only additional <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$a$">segment references</a> are counted by <code class="highlight">@r</code>, so <code class="highlight">S@r=5</code> indicates a total of 6 consecutive <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$a$">media segments</a> with the same duration.</p> <p>The <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointd$">segment start point</a> is calculated by adding the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointe$">segment start point</a> and duration of the previous <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$b$">media segment</a>, unless <code class="highlight">S@t</code> is specified in which case <code class="highlight">S@t</code> is the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointf$">segment start point</a> on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinea$h$">sample timeline</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.6).</p> <p>The value of <code class="highlight">S@r</code> is nonnegative, except for the last <code class="highlight">S</code> element which MAY have a negative value in <code class="highlight">S@r</code> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.6), indicating that the repeated <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$b$">segment references</a> continue indefinitely up to a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$c$">media segment</a> that either ends at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$d$">period</a> end point.</p> <p><a href="#timing-mpd-updates">Updates to the MPD of a dynamic presentation</a> MAY add more <code class="highlight">S</code> elements, remove expired <code class="highlight">S</code> elements, increment <code class="highlight">SegmentTemplate@startNumber</code>, add the <code class="highlight">S@t</code> attribute to the first <code class="highlight">S</code> element or increase the value of <code class="highlight">S@r</code> on the last <code class="highlight">S</code> element but SHALL NOT otherwise modify existing <code class="highlight">S</code> elements.</p> <p>The <code class="highlight">S@n</code> attribute SHALL NOT be used - segment numbers form a continuous sequence starting with <code class="highlight">SegmentTemplate@startNumber</code>.</p> <p>The <code class="highlight">SegmentTemplate@eptDelta</code> attribute SHALL NOT be present. The information represented by this attribute can be calculated independently and having it be present would only create additional possibility for conflicting data.</p> <p>The <code class="highlight">SegmentTemplate@media</code> attribute SHALL contain the URL template for referencing <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$d$">media segments</a>. The <code class="highlight">SegmentTemplate@initialization</code> attribute SHALL contain the URL template for referencing initialization segments.</p> <p>Either the <code class="highlight">$Time$</code> or <code class="highlight">$Number$</code> template variable SHALL be present in <code class="highlight">SegmentTemplate@media</code> to uniquely identify <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$e$">media segments</a>:</p> <ul> <li data-md> <p>If using <code class="highlight">$Number$</code> addressing, the number of the first segment reference is defined by <code class="highlight">SegmentTemplate@startNumber</code> (default value 1) (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.5.3).</p> <li data-md> <p>If using <code class="highlight">$Time$</code> addressing, the value for each <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$c$">segment reference</a> is the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointg$">segment start point</a> on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$�$">sample timeline</a>, in <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitsc$">timescale units</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.5.3).</p> </ul> <div class="example" id="example-21df440c"> <a class="self-link" href="#example-21df440c"></a> Below is an example of common usage of <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressingd$">explicit addressing</a>. <p>The example defines 225 <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$f$">media segments</a> starting at position 900 (or 0.9 seconds) on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$`$">sample timeline</a> and lasting for a total of 900.225 seconds. The <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$e$">period</a> is only 900 seconds long, so the last 0.225 seconds of content is clipped (out of bounds samples may also simply be omitted from the last <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$g$">media segment</a>). The <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$f$">period</a> start point is at position 900 (or 0.9 seconds) on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$a$">sample timeline</a> which matches the start position of the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$a$h$">media segment</a> found at the relative URL <code class="highlight">video/900.m4s</code>.</p> <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-><c- f>></c-> <c- f>&lt;Period</c-> <c- e>duration=</c-><c- s>"PT900S"</c-><c- f>></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation></c-> <c- f>&lt;SegmentTemplate</c-> <c- e>timescale=</c-><c- s>"1000"</c-> <c- e>presentationTimeOffset=</c-><c- s>"900"</c-> <c- e>media=</c-><c- s>"video/$Time$.m4s"</c-> <c- e>initialization=</c-><c- s>"video/init.mp4"</c-><c- f>></c-> <c- f>&lt;SegmentTimeline></c-> <c- f>&lt;S</c-> <c- e>t=</c-><c- s>"900"</c-> <c- e>d=</c-><c- s>"4001"</c-> <c- e>r=</c-><c- s>"224"</c-> <c- f>/></c-> <c- f>&lt;/SegmentTimeline></c-> <c- f>&lt;/SegmentTemplate></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$b$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$c$">MPD</a> file.</p> </div> <div class="example" id="example-9483a2eb"> <a class="self-link" href="#example-9483a2eb"></a> Below is an example of <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressinge$">explicit addressing</a> used in a scenario where different <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$�$">media segments</a> have different durations (e.g. due to encoder limitations). <p>The example defines a sequence of 11 <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$`$">media segments</a> starting at position 120 (or 0.12 seconds) on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$b$">sample timeline</a> and lasting for a total of 95520 units at a <a data-link-type="dfn" href="#timescale" id="ref-for-timescalea$">timescale</a> of 1000 units per second (which results in 95.52 seconds of data). The <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$g$">period</a> start point on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$c$">sample timeline</a> is at position 810 (or 0.81 seconds), which is within the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$a$">media segment</a>, found at the relative URL <code class="highlight">video/120.m4s</code>. The fifth <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$b$">media segment</a> repeats once, resulting in a sixth <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$c$">media segment</a> with the same duration.</p> <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-><c- f>></c-> <c- f>&lt;Period></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation></c-> <c- f>&lt;SegmentTemplate</c-> <c- e>timescale=</c-><c- s>"1000"</c-> <c- e>presentationTimeOffset=</c-><c- s>"810"</c-> <c- e>media=</c-><c- s>"video/$Time$.m4s"</c-> <c- e>initialization=</c-><c- s>"video/init.mp4"</c-><c- f>></c-> <c- f>&lt;SegmentTimeline></c-> <c- f>&lt;S</c-> <c- e>t=</c-><c- s>"120"</c-> <c- e>d=</c-><c- s>"8520"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"8640"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"8600"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"8680"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"9360"</c-> <c- e>r=</c-><c- s>"1"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"8480"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"9080"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"6440"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"10000"</c-><c- f>/></c-> <c- f>&lt;S</c-> <c- e>d=</c-><c- s>"8360"</c-><c- f>/></c-> <c- f>&lt;/SegmentTimeline></c-> <c- f>&lt;/SegmentTemplate></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$d$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$e$">MPD</a> file.</p> </div> <h4 class="heading settled" data-level="18.3.1" id="addressing-explicit-startpoint"><span class="secno">18.3.1. </span><span class="content">Moving the period start point (explicit addressing)</span><a class="self-link" href="#addressing-explicit-startpoint"></a></h4> <p>When splitting <a data-link-type="dfn" href="#periods" id="ref-for-periods`$g$h$">periods</a> in two or performing other types of editorial timing adjustments, a service might want to start a <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$�$">period</a> at a point after the "natural" start point of the <a data-link-type="dfn" href="#representations" id="ref-for-representationsg$h$">representations</a> within.</p> <p>For <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$�$">representations</a> that use <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressingf$">explicit addressing</a>, perform the following adjustments to set a new <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$`$">period</a> start point:</p> <div class="algorithm"> <ol> <li data-md> <p>Update <code class="highlight">SegmentTemplate@presentationTimeOffset</code> to indicate the desired start point on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$d$">sample timeline</a>.</p> <li data-md> <p>Update <code class="highlight">Period@duration</code> to match the new duration.</p> <li data-md> <p>Remove any <a data-link-type="dfn" href="#unnecessary-segment-reference" id="ref-for-unnecessary-segment-referencec$">unnecessary segment references</a>.</p> <li data-md> <p>If using the <code class="highlight">$Number$</code> template variable, increment <code class="highlight">SegmentTemplate@startNumber</code> by the number of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$d$">media segments</a> removed from the beginning of the <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$`$">representation</a>.</p> </ol> </div> <p class="note" role="note"><span>Note:</span> See <a href="#representation-timing">�/ 9 Representation timing</a> and <a href="#timing-mpd-updates-remove-content">�/ 13.6.3 Removing content from the MPD</a> to understand the constraints that apply to <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$d$">segment reference</a> removal.</p> <h3 class="heading settled" data-level="18.4" id="addressing-simple"><span class="secno">18.4. </span><span class="content">Simple addressing</span><a class="self-link" href="#addressing-simple"></a></h3> <p>A representation that uses <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="simple-addressing">simple addressing</dfn> consists of a set of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$e$">media segments</a> accessed via URLs constructed using a template defined in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$f$">MPD</a>, with the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$g$">MPD</a> describing the nominal time span of the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$e$">sample timeline</a> covered by each <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$f$">media segment</a>.</p> <p><strong class="advisement"> <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressinge$">Simple addressing</a> defines the nominal time span of each <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$g$">media segment</a> in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$b$h$">MPD</a>. The true time span covered by samples within the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$b$h$">media segment</a> can be slightly different than the nominal time span. See <a href="#addressing-simple-inaccuracy">�/ 18.4.1 Inaccuracy in media segment timing when using simple addressing</a>.</strong></p> <p class="note" role="note"><span>Note:</span> This addressing mode is sometimes called "SegmentTemplate without SegmentTimeline" in other documents.</p> <p>Clauses in section only apply to <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$a$">representations</a> that use <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressingf$">simple addressing</a>.</p> <figure> <img src="Images/Timing/SimpleAddressing.png"> <figcaption><a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressingg$">Simple addressing</a> uses a segment template that is combined with approximate first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$�$">media segment</a> timing information and an average <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$`$">media segment</a> duration in order to reference <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$a$">media segments</a>, either by start time or by sequence number. Note that <code class="highlight">@eptDelta</code> does not affect the generated paths!</figcaption> </figure> <p>The <code class="highlight">SegmentTemplate@duration</code> attribute defines the nominal duration of a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$b$">media segment</a> in <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitsd$">timescale units</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.2).</p> <p>The set of <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$e$">segment references</a> consists of the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$c$">media segment</a> starting <code class="highlight">SegmentTemplate@eptDelta</code> <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitse$">timescale units</a> relative to the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$a$">period</a> start point and all other <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$d$">media segments</a> following in a consecutive series of equal time spans of <code class="highlight">SegmentTemplate@duration</code> <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitsf$">timescale units</a>, ending with a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$e$">media segment</a> that ends at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$b$">period</a> end time. The <code class="highlight">@eptDelta</code> attribute SHALL be present if its value is not zero.</p> <p class="note" role="note"><span>Note:</span> <code class="highlight">@eptDelta</code> is expressed as an offset from the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$c$">period</a> start point to the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-pointh$">segment start point</a> of the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$f$">media segment</a> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.2). In other words, the value will be negative if the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$g$">media segment</a> starts before the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$d$">period</a> start point.</p> <p><strong class="advisement"> <code class="highlight">@eptDelta</code> is new in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 4th edition (published 2020) and DASH client support is not yet widespread. Clients that do not implement support for <code class="highlight">@eptDelta</code> may fail to correctly begin or end playback of <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$e$">periods</a> that use <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressingh$">simple addressing</a> with <code class="highlight">@eptDelta != 0</code>. If the client cannot be upgraded to consider <code class="highlight">@eptDelta</code> then you are advised to use <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressingg$">explicit addressing</a> with such content.</strong></p> <p>The <code class="highlight">SegmentTemplate@media</code> attribute SHALL contain the URL template for referencing <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$c$h$">media segments</a>. The <code class="highlight">SegmentTemplate@initialization</code> attribute SHALL contain the URL template for referencing initialization segments.</p> <p>Either the <code class="highlight">$Time$</code> or <code class="highlight">$Number$</code> template variable SHALL be present in <code class="highlight">SegmentTemplate@media</code> to uniquely identify <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$�$">media segments</a>:</p> <ul> <li data-md> <p>If using <code class="highlight">$Number$</code> addressing, the number of the first segment reference is defined by <code class="highlight">SegmentTemplate@startNumber</code> (default value 1) (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.5.3).</p> <li data-md> <p>If using <code class="highlight">$Time$</code> addressing, the template value for each <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$f$">segment reference</a> is the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$�$">segment start point</a> on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$f$">sample timeline</a> minus <code class="highlight">@eptDelta</code> (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 5.3.9.5.3).</p> </ul> <div class="example" id="example-7f8fd8e7"> <a class="self-link" href="#example-7f8fd8e7"></a> Below is an example of common usage of <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$�$">simple addressing</a>. <p>The example defines a <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$g$">sample timeline</a> with a <a data-link-type="dfn" href="#timescale" id="ref-for-timescaleb$">timescale</a> of 1000 units per second, with the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$f$">period</a> starting at position 900 (or 0.9 seconds) on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelineb$h$">sample timeline</a> and the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$`$">media segment</a> starting at position 400 (or 0.4 seconds). The average duration of a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$a$">media segment</a> is 4001 (4.001 seconds). <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$b$">Media segment</a> numbering starts at 800, so the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$c$">media segment</a> is found at the relative URL <code class="highlight">video/800.m4s</code>. The sequence of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$d$">media segments</a> continues to the end of the period, which is 900 seconds long, making for a total of 226 defined <a data-link-type="dfn" href="#segment-references" id="ref-for-segment-referencesc$g$">segment references</a>.</p> <p>The <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$g$">period</a> start point is 500 milliseconds after the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$`$">segment start point</a> of the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$e$">media segment</a> and the <a data-link-type="dfn" href="#periods" id="ref-for-periods`$h$h$">period</a> end point is approximately 275 milliseconds after the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$a$">segment start point</a> of the last <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$f$">media segment</a>. The real timing of the samples within the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$g$">media segments</a> may differ from these nominal values in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$�$">MPD</a>, to the extent permitted by the timing model.</p> <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-><c- f>></c-> <c- f>&lt;Period</c-> <c- e>duration=</c-><c- s>"PT900S"</c-><c- f>></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation></c-> <c- f>&lt;SegmentTemplate</c-> <c- e>timescale=</c-><c- s>"1000"</c-> <c- e>presentationTimeOffset=</c-><c- s>"900"</c-> <c- e>eptDelta=</c-><c- s>"-500"</c-> <c- e>media=</c-><c- s>"video/$Number$.m4s"</c-> <c- e>initialization=</c-><c- s>"video/init.mp4"</c-> <c- e>duration=</c-><c- s>"4001"</c-> <c- e>startNumber=</c-><c- s>"800"</c-> <c- f>/></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$`$">MPD</a> structure that are not relevant for this chapter have been omitted - this is not a fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$a$">MPD</a> file.</p> </div> <h4 class="heading settled" data-level="18.4.1" id="addressing-simple-inaccuracy"><span class="secno">18.4.1. </span><span class="content">Inaccuracy in media segment timing when using simple addressing</span><a class="self-link" href="#addressing-simple-inaccuracy"></a></h4> <p>When using <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$`$">simple addressing</a>, the samples contained in a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$d$h$">media segment</a> MAY cover a different time span on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinec$�$">sample timeline</a> than what is indicated by the nominal timing in the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$b$">MPD</a>, as long as no constraints defined in this document are violated by this deviation.</p> <figure> <img src="Images/Timing/InaccurateAddressing.png"> <figcaption><a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$a$">Simple addressing</a> relaxes the requirement on <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$�$">media segment</a> contents matching the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinec$`$">sample timeline</a>. Red boxes indicate samples.</figcaption> </figure> <p>The allowed deviation is defined as the maximum offset between the edges of the nominal time span (as defined by the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$c$">MPD</a>) and the edges of the true time span (as defined by the contents of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$`$">media segment</a>). The deviation is evaluated separately for each edge.</p> <p><strong class="advisement"> This allowed deviation does not relax any requirements that do not explicitly define an exception.</strong></p> <p>The maximum deviation of either edge is 50% of the nominal <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$a$">media segment</a> duration and MAY be in either direction (<a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 7.2.1).</p> <p class="note" role="note"><span>Note:</span> This results in a maximum true duration of 200% (+50% outward extension on both edges) and a minimum true duration of 1 sample (-50% inward from both edges would result in 0 duration but empty <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$b$">media segments</a> are not allowed).</p> <p>Allowing inaccurate timing is intended to enable reasoning on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinec$a$">sample timeline</a> using average values for <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$c$">media segment</a> timing. If the addressing data says that a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$d$">media segment</a> contains 4 seconds of data on average, a client can predict with reasonable accuracy which samples are found in which <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$e$">media segments</a>, while at the same time the service is not required to publish per-segment timing data in the MPD. It is expected that the content is packaged with this contraint in mind (i.e. <strong>every</strong> segment cannot be inaccurate in the same direction - a shorter segment now implies a longer segment in the future to make up for it).</p> <p>To ensure that no gaps in the timeline are introduced by the allowed inaccuracy, additional constraints apply to the contents of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$f$">media segments</a> at the edges of a <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$�$">period</a>:</p> <ul> <li data-md> <p>The [=media segment] that starts at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$`$">period</a> start point SHALL contain a sample that starts at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$a$">period</a> start point.</p> <li data-md> <p>The [=media segment] that ends at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$b$">period</a> end point SHALL contain a sample that ends at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$c$">period</a> end point.</p> </ul> <div class="example" id="example-2ea5cd1b"> <a class="self-link" href="#example-2ea5cd1b"></a> Consider a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$g$">media segment</a> with a nominal start time of 8 seconds from <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$d$">period</a> start and a nominal duration of 4 seconds, within a <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$e$">period</a> of unlimited duration. <p>The following are all valid contents for such a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$e$h$">media segment</a>:</p> <ul> <li data-md> <p>samples from 8 to 12 seconds (perfect accuracy)</p> <li data-md> <p>samples from 6 to 14 seconds (maximally large segment allowed, 50% increase from both ends)</p> <li data-md> <p>samples from 9.9 to 10 seconds (near-minimally small segment; while we allow a 50% decrease from both ends, potentially resulting in zero duration, every segment must still contain at least one sample)</p> <li data-md> <p>samples from 6 to 10 seconds (maximal offset toward zero point at both ends)</p> <li data-md> <p>samples from 10 to 14 seconds (maximal offset away from zero point at both ends)</p> </ul> <p>Near <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$f$">period</a> boundaries, all the constraints of timing and addressing must still be respected! Consider a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$�$">media segment</a> with a nominal start time of 0 seconds from <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$g$">period</a> start and a nominal duration of 4 seconds. If such a <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$`$">media segment</a> contained samples from 1 to 5 seconds (offset of 1 second away from zero point at both ends, which is within acceptable limits) it would be nonconforming because of the requirement that the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$a$">media segment</a> contain a media sample that starts at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$�$h$">period</a> start point.</p> </div> <h4 class="heading settled" data-level="18.4.2" id="addressing-simple-startpoint"><span class="secno">18.4.2. </span><span class="content">Moving the period start point (simple addressing)</span><a class="self-link" href="#addressing-simple-startpoint"></a></h4> <p>When splitting <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$�$">periods</a> in two or performing other types of editorial timing adjustments, a service might want to start a <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$`$">period</a> at a point after the "natural" start point of the <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$b$">representations</a> within. This can be challenging when using <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$b$">simple addressing</a>.</p> <p><strong class="advisement"> The <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$b$">media segment</a> that overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$a$">period</a> start point must contain a sample that starts at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$b$">period</a> start point. Likewise, the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$c$">media segment</a> that overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$c$">period</a> end point must contain a sample that ends at or overlaps the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$d$">period</a> end point. These constraints are defined in <a href="#addressing-simple-inaccuracy">�/ 18.4.1 Inaccuracy in media segment timing when using simple addressing</a> and typically make it impossible to move the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$e$">period</a> start point or split a <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$f$">period</a> when using <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$c$">simple addressing</a> and taking advantage of the inaccuracy allowed to exist between nominal timing of the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinec$b$">sample timeline</a> and the true contents of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$d$">media segments</a>.</strong></p> <p>The rest of this chapter assumes that the nominal timing of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$e$">media segments</a> matches the real timing. If you cannot satisfy this constraint but still wish to move the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$g$">period</a> start point, convert to <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressingh$">explicit addressing</a>. See <a href="#addressing-simple-to-explicit">�/ 18.4.3 Converting simple addressing to explicit addressing</a>.</p> <p>To move the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$`$h$">period</a> start point for <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$c$">representations</a> that use <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$d$">simple addressing</a> without timing inaccuracy:</p> <div class="algorithm"> <ol> <li data-md> <p>Update <code class="highlight">SegmentTemplate@presentationTimeOffset</code> to indicate the desired <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$a$�$">period</a> start point on the <a data-link-type="dfn" href="#sample-timeline" id="ref-for-sample-timelinec$c$">sample timeline</a>.</p> <li data-md> <p>Update <code class="highlight">SegmentTemplate@eptDelta</code> to indicate the relative position of the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$b$">segment start point</a> of the first <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$f$">media segment</a> from the start of the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$a$`$">period</a> (with a negative sign indicating the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$c$">segment start point</a> is before the <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$a$a$">period</a> start point).</p> <li data-md> <p>If using the <code class="highlight">$Time$</code> template variable and if the value of <code class="highlight">@eptDelta</code> changed in the previous step, rename all <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$g$">media segments</a> to conform to the new pattern generated by the URL template. The pattern will change whenever <code class="highlight">@eptDelta</code> changes because <code class="highlight">$Time$</code> refers not only to the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$d$">segment start point</a> but also includes <code class="highlight">@eptDelta</code>.</p> <li data-md> <p>If using the <code class="highlight">$Number$</code> template variable, increment <code class="highlight">SegmentTemplate@startNumber</code> by the number of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$f$h$">media segments</a> removed from the beginning of the <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$d$">representation</a>.</p> <li data-md> <p>Update <code class="highlight">Period@duration</code> to match the new duration.</p> </ol> </div> <p><strong class="advisement"> <code class="highlight">@eptDelta</code> is new in <a data-link-type="biblio" href="#biblio-dash">[DASH]</a> 4th edition (published 2020). If the resulting <code class="highlight">SegmentTemplate@eptDelta</code> value is not zero, DASH clients that do not support <code class="highlight">@eptDelta</code> may exhibit incorrect behavior when transitioning between <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$a$b$">periods</a>. The only workaround is to either <a href="#addressing-simple-to-explicit">convert to explicit addressing</a> or to choose a <a data-link-type="dfn" href="#periods" id="ref-for-periodsa$a$c$">period</a> start point that overlaps with the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$e$">segment start points</a> of all <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$e$">representations</a> in all adaptation sets that use <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$e$">simple addressing</a>! Such points might not exist, depending on the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$g$�$">media segment</a> structure of the <a data-link-type="dfn" href="#presentation" id="ref-for-presentationa$`$">presentation</a>.</strong></p> <h4 class="heading settled" data-level="18.4.3" id="addressing-simple-to-explicit"><span class="secno">18.4.3. </span><span class="content">Converting simple addressing to explicit addressing</span><a class="self-link" href="#addressing-simple-to-explicit"></a></h4> <p>It may sometimes be desirable to convert a presentation from <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$f$">simple addressing</a> to <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressing`$�$">explicit addressing</a>. This chapter provides an algorithm to do this.</p> <p><strong class="advisement"> <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$g$">Simple addressing</a> allows for inaccuracy in <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$g$`$">media segment</a> timing. No inaccuracy is allowed by <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressing`$`$">explicit addressing</a>. The mechanism of conversion described here is only valid when there is no inaccuracy. If the nominal time spans in original the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$d$">MPD</a> differ from the true time spans of the <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$g$a$">media segments</a>, re-package the content from scratch using <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressing`$a$">explicit addressing</a> instead of converting the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$e$">MPD</a>.</strong></p> <p>To perform the conversion, execute the following steps:</p> <div class="algorithm"> <ol> <li data-md> <p>Calculate the number of <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$g$b$">media segments</a> in the <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$f$">representation</a> as <code class="highlight">SegmentCount = Ceil((AsSeconds(Period@duration) - AsSeconds(SegmentTempalte@eptDelta)) / ( SegmentTemplate@duration / SegmentTemplate@timescale))</code>.</p> <li data-md> <p>Update the MPD.</p> <ol> <li data-md> <p>Add a single <code class="highlight">SegmentTemplate/SegmentTimeline</code> element.</p> <li data-md> <p>Add a single <code class="highlight">SegmentTimeline/S</code> element.</p> <li data-md> <p>Set <code class="highlight">S@t</code> to equal <code class="highlight">SegmentTemplate@presentationTimeOffset</code> plus <code class="highlight">@eptDelta</code>.</p> <li data-md> <p>Set <code class="highlight">S@d</code> to equal <code class="highlight">SegmentTemplate@duration</code>.</p> <li data-md> <p>Remove <code class="highlight">SegmentTemplate@duration</code>.</p> <li data-md> <p>Set <code class="highlight">S@r</code> to <code class="highlight">SegmentCount - 1</code>.</p> <li data-md> <p>Remove <code class="highlight">SegmentTemplate@eptDelta</code>. It is not needed nor permitted with <a data-link-type="dfn" href="#explicit-addressing" id="ref-for-explicit-addressing`$b$">explicit addressing</a>.</p> </ol> <li data-md> <p>If using <code class="highlight">$Time$</code> addressing in <code class="highlight">SegmentTemplate@media</code>, rename all <a data-link-type="dfn" href="#media-segment" id="ref-for-media-segment`$g$c$">media segments</a> to match the <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$f$">segment start point</a> in the template variable (<a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressing`$h$">simple addressing</a> uses <a data-link-type="dfn" href="#segment-start-point" id="ref-for-segment-start-point`$g$">segment start point</a> minus <code class="highlight">@eptDelta</code> for <code class="highlight">$Time$</code>).</p> </ol> </div> <div class="example" id="example-c1bfd391"> <a class="self-link" href="#example-c1bfd391"></a> Below is an example of a <a data-link-type="dfn" href="#simple-addressing" id="ref-for-simple-addressinga$�$">simple addressing</a> <a data-link-type="dfn" href="#representations" id="ref-for-representationsh$g$">representation</a> before conversion. <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-><c- f>></c-> <c- f>&lt;Period</c-> <c- e>duration=</c-><c- s>"PT900S"</c-><c- f>></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation></c-> <c- f>&lt;SegmentTemplate</c-> <c- e>timescale=</c-><c- s>"1000"</c-> <c- e>presentationTimeOffset=</c-><c- s>"900"</c-> <c- e>eptDelta=</c-><c- s>"-500"</c-> <c- e>media=</c-><c- s>"video/$Number$.m4s"</c-> <c- e>initialization=</c-><c- s>"video/init.mp4"</c-> <c- e>duration=</c-><c- s>"4001"</c-> <c- e>startNumber=</c-><c- s>"800"</c-> <c- f>/></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>As part of the conversion, we calculate <code class="highlight">SegmentCount = Ceil((900 - (-0.5)) / (4001 / 1000)) = 226</code>.</p> <p>After conversion, we arrive at the following result.</p> <pre class="highlight"><c- f>&lt;MPD</c-> <c- e>xmlns=</c-><c- s>"urn:mpeg:dash:schema:mpd:2011"</c-><c- f>></c-> <c- f>&lt;Period</c-> <c- e>duration=</c-><c- s>"PT900S"</c-><c- f>></c-> <c- f>&lt;AdaptationSet></c-> <c- f>&lt;Representation></c-> <c- f>&lt;SegmentTemplate</c-> <c- e>timescale=</c-><c- s>"1000"</c-> <c- e>presentationTimeOffset=</c-><c- s>"900"</c-> <c- e>media=</c-><c- s>"video/$Number$.m4s"</c-> <c- e>initialization=</c-><c- s>"video/init.mp4"</c-> <c- e>startNumber=</c-><c- s>"800"</c-><c- f>></c-> <c- f>&lt;SegmentTimeline></c-> <c- f>&lt;S</c-> <c- e>t=</c-><c- s>"400"</c-> <c- e>d=</c-><c- s>"4001"</c-> <c- e>r=</c-><c- s>"224"</c-> <c- f>/></c-> <c- f>&lt;/SegmentTimeline></c-> <c- f>&lt;/SegmentTemplate></c-> <c- f>&lt;/Representation></c-> <c- f>&lt;/AdaptationSet></c-> <c- f>&lt;/Period></c-> <c- f>&lt;/MPD></c-> </pre> <p>Parts of the <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$f$">MPD</a> structure that are not relevant for this chapter have been omitted - the above are not fully functional <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$g$">MPD</a> files.</p> </div> <h2 class="heading settled" data-level="19" id="timescale-constraints"><span class="secno">19. </span><span class="content">Large timescales and time values</span><a class="self-link" href="#timescale-constraints"></a></h2> <p><a data-link-type="biblio" href="#biblio-ecmascript">[ECMASCRIPT]</a> is unable to accurately represent numeric values greater than 2<sup>53</sup> (<code class="highlight">9007199254740991</code>) using built-in types. Therefore, interoperable services cannot use such values.</p> <p>All timescales are start times used in a DASH presentations SHALL be sufficiently small that no timecode value exceeding 2<sup>53</sup> will be encountered, even during the publishing of long-lasting live services.</p> <p class="note" role="note"><span>Note:</span> This may require the use of 64-bit fields, although the values must still be limited to under 2<sup>53</sup>.</p> <div class="example" id="example-f155d68c"> <a class="self-link" href="#example-f155d68c"></a> <p>The issue does not arise with the common 90 KHz <a data-link-type="dfn" href="#timescale" id="ref-for-timescalec$">timescale</a>. Counting time since the Unix epoch until 11 November 2019 we get <code class="highlight">141721093260000</code> which is well within the allowed range of values.</p> <p>Another common timescale is 10000000 (10 million <a data-link-type="dfn" href="#timescale-units" id="ref-for-timescale-unitsg$">timescale units</a> per second) often used by Smooth Streaming. Counting time since the Unix epoch until 11 November 2019 we get <code class="highlight">15746788140000000</code> which does exceed the critical value and will result in broken playback on many clients! To correct such an error, use a smaller timescale or a <a data-link-type="dfn" href="#mpd-timeline" id="ref-for-mpd-timelineb$g$">MPD timeline</a> zero point that is not so far in the past.</p> </div> <h2 class="heading settled" data-level="20" id="xml-duration-constraints"><span class="secno">20. </span><span class="content">Representing durations in XML</span><a class="self-link" href="#xml-duration-constraints"></a></h2> <p>All units expressed in <a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$c$h$">MPD</a> fields of datatype <code class="highlight">xs:duration</code> SHALL be treated as fixed size:</p> <ul> <li data-md> <p>60S = 1M (minute)</p> <li data-md> <p>60M = 1H</p> <li data-md> <p>24H = 1D</p> <li data-md> <p>30D = 1M (month)</p> <li data-md> <p>12M = 1Y</p> </ul> <p><a data-link-type="dfn" href="#mpd" id="ref-for-mpd`$d$�$">MPD</a> fields having datatype <code class="highlight">xs:duration</code> SHALL NOT use the year and month units and SHOULD be expressed as a count of seconds, without using any of the larger units.</p> <script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=default" type="text/javascript"></script> </main> <div data-fill-with="conformance"> <h2 class="no-ref no-num heading settled" id="conformance"><span class="content"> Conformance</span><a class="self-link" href="#conformance"></a></h2> <p> Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words  MUST ,  MUST NOT ,  REQUIRED ,  SHALL ,  SHALL NOT ,  SHOULD ,  SHOULD NOT ,  RECOMMENDED ,  MAY , and  OPTIONAL in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification. </p> <p> All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. <a data-link-type="biblio" href="#biblio-rfc2119">[RFC2119]</a> </p> <p> Examples in this specification are introduced with the words  for example or are set apart from the normative text with <code>class="example"</code>, like this: </p> <div class="example" id="example-example"><a class="self-link" href="#example-example"></a> This is an example of an informative example. </div> <p> Informative notes begin with the word  Note and are set apart from the normative text with <code>class="note"</code>, like this: </p> <p class="note" role="note"> Note, this is an informative note. </p> </div> <script> (function() { "use strict"; var collapseSidebarText = '<span aria-hidden="true">�!</span> ' + '<span>Collapse Sidebar</span>'; var expandSidebarText = '<span aria-hidden="true">�!</span> ' + '<span>Pop Out Sidebar</span>'; var tocJumpText = '<span aria-hidden="true">�!</span> ' + '<span>Jump to Table of Contents</span>'; var sidebarMedia = window.matchMedia('screen and (min-width: 78em)'); var autoToggle = function(e){ toggleSidebar(e.matches) }; if(sidebarMedia.addListener) { sidebarMedia.addListener(autoToggle); } function toggleSidebar(on) { if (on == undefined) { on = !document.body.classList.contains('toc-sidebar'); } /* Don t scroll to compensate for the ToC if we re above it already. */ var headY = 0; var head = document.querySelector('.head'); if (head) { // terrible approx of "top of ToC" headY += head.offsetTop + head.offsetHeight; } var skipScroll = window.scrollY < headY; var toggle = document.getElementById('toc-toggle'); var tocNav = document.getElementById('toc'); if (on) { var tocHeight = tocNav.offsetHeight; document.body.classList.add('toc-sidebar'); document.body.classList.remove('toc-inline'); toggle.innerHTML = collapseSidebarText; if (!skipScroll) { window.scrollBy(0, 0 - tocHeight); } tocNav.focus(); sidebarMedia.addListener(autoToggle); // auto-collapse when out of room } else { document.body.classList.add('toc-inline'); document.body.classList.remove('toc-sidebar'); toggle.innerHTML = expandSidebarText; if (!skipScroll) { window.scrollBy(0, tocNav.offsetHeight); } if (toggle.matches(':hover')) { /* Unfocus button when not using keyboard navigation, because I don t know where else to send the focus. */ toggle.blur(); } } } function createSidebarToggle() { /* Create the sidebar toggle in JS; it shouldn t exist when JS is off. */ var toggle = document.createElement('a'); /* This should probably be a button, but appearance isn t standards-track.*/ toggle.id = 'toc-toggle'; toggle.class = 'toc-toggle'; toggle.href = '#toc'; toggle.innerHTML = collapseSidebarText; sidebarMedia.addListener(autoToggle); var toggler = function(e) { e.preventDefault(); sidebarMedia.removeListener(autoToggle); // persist explicit off states toggleSidebar(); return false; } toggle.addEventListener('click', toggler, false); /* Get <nav id=toc-nav>, or make it if we don t have one. */ var tocNav = document.getElementById('toc-nav'); if (!tocNav) { tocNav = document.createElement('p'); tocNav.id = 'toc-nav'; /* Prepend for better keyboard navigation */ document.body.insertBefore(tocNav, document.body.firstChild); } /* While we re at it, make sure we have a Jump to Toc link. */ var tocJump = document.getElementById('toc-jump'); if (!tocJump) { tocJump = document.createElement('a'); tocJump.id = 'toc-jump'; tocJump.href = '#toc'; tocJump.innerHTML = tocJumpText; tocNav.appendChild(tocJump); } tocNav.appendChild(toggle); } var toc = document.getElementById('toc'); if (toc) { createSidebarToggle(); toggleSidebar(sidebarMedia.matches); /* If the sidebar has been manually opened and is currently overlaying the text (window too small for the MQ to add the margin to body), then auto-close the sidebar once you click on something in there. */ toc.addEventListener('click', function(e) { if(e.target.tagName.toLowerCase() == "a" && document.body.classList.contains('toc-sidebar') && !sidebarMedia.matches) { toggleSidebar(false); } }, false); } else { console.warn("Can t find Table of Contents. Please use <nav id='toc'> around the ToC."); } /* Wrap tables in case they overflow */ var tables = document.querySelectorAll(':not(.overlarge) > table.data, :not(.overlarge) > table.index'); var numTables = tables.length; for (var i = 0; i < numTables; i++) { var table = tables[i]; var wrapper = document.createElement('div'); wrapper.className = 'overlarge'; table.parentNode.insertBefore(wrapper, table); wrapper.appendChild(table); } })(); </script> <h2 class="no-num no-ref heading settled" id="index"><span class="content">Index</span><a class="self-link" href="#index"></a></h2> <h3 class="no-num no-ref heading settled" id="index-defined-here"><span class="content">Terms defined by this specification</span><a class="self-link" href="#index-defined-here"></a></h3> <ul class="index"> <li><a href="#addressing-modes">addressing modes</a><span>, in �18</span> <li><a href="#availability-window">availability window</a><span>, in �13.3</span> <li><a href="#available">available</a><span>, in �13.3</span> <li><a href="#dynamic-presentation">dynamic presentation</a><span>, in �7</span> <li><a href="#effective-availability-start-time">effective availability start time</a><span>, in �7</span> <li><a href="#effective-time-shift-buffer">effective time shift buffer</a><span>, in �13.5</span> <li><a href="#explicit-addressing">explicit addressing</a><span>, in �18.3</span> <li><a href="#indexed-addressing">indexed addressing</a><span>, in �18.1</span> <li><a href="#media-segment">media segment</a><span>, in �11</span> <li><a href="#mpd">MPD</a><span>, in �4.1</span> <li><a href="#mpd-refreshes">MPD refreshes</a><span>, in �13.7</span> <li><a href="#mpd-timeline">MPD timeline</a><span>, in �6</span> <li><a href="#mpd-validity-duration">MPD validity duration</a><span>, in �13.6.1</span> <li><a href="#period-connected">period-connected</a><span>, in �12</span> <li><a href="#periods">periods</a><span>, in �8</span> <li><a href="#presentation">presentation</a><span>, in �4.1</span> <li><a href="#presentation-delay">presentation delay</a><span>, in �13.5</span> <li><a href="#representations">Representations</a><span>, in �9</span> <li><a href="#sample-timeline">sample timeline</a><span>, in �9.1</span> <li><a href="#segment-end-point">segment end point</a><span>, in �11</span> <li><a href="#segment-references">segment references</a><span>, in �9</span> <li><a href="#segment-start-point">segment start point</a><span>, in �11</span> <li><a href="#simple-addressing">simple addressing</a><span>, in �18.4</span> <li><a href="#static-presentation">static presentation</a><span>, in �7</span> <li><a href="#timescale">timescale</a><span>, in �9.1</span> <li><a href="#timescale-units">timescale units</a><span>, in �9.1</span> <li><a href="#time-shift">time shift</a><span>, in �13.4</span> <li><a href="#time-shift-buffer">time shift buffer</a><span>, in �13.4</span> <li><a href="#unnecessary-segment-reference">unnecessary segment reference</a><span>, in �9.2.3</span> <li><a href="#wall-clock">wall clock</a><span>, in �13.1</span> </ul> <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2> <h3 class="no-num no-ref heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3> <dl> <dt id="biblio-cmaf">[CMAF] <dd><a href="https://www.iso.org/standard/79106.html">Information technology  Multimedia application format (MPEG-A)  Part 19: Common media application format (CMAF) for segmented media</a>. March 2020. Published. URL: <a href="https://www.iso.org/standard/79106.html">https://www.iso.org/standard/79106.html</a> <dt id="biblio-dash">[DASH] <dd><a href="https://www.iso.org/standard/79329.html">Information technology  Dynamic adaptive streaming over HTTP (DASH)  Part 1: Media presentation description and segment formats</a>. December 2019. Published. URL: <a href="https://www.iso.org/standard/79329.html">https://www.iso.org/standard/79329.html</a> <dt id="biblio-dash-cmaf">[DASH-CMAF] <dd><a href="https://www.iso.org/standard/79884.html">Information technology  Dynamic adaptive streaming over HTTP (DASH)  Part 1: Media presentation description and segment formats  Amendment 1: CMAF support, events processing model and other extensions</a>. Under development. URL: <a href="https://www.iso.org/standard/79884.html">https://www.iso.org/standard/79884.html</a> <dt id="biblio-isobmff">[ISOBMFF] <dd><a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/c068960_ISO_IEC_14496-12_2015.zip">Information technology  Coding of audio-visual objects  Part 12: ISO Base Media File Format</a>. December 2015. International Standard. URL: <a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/c068960_ISO_IEC_14496-12_2015.zip">http://standards.iso.org/ittf/PubliclyAvailableStandards/c068960_ISO_IEC_14496-12_2015.zip</a> <dt id="biblio-mpeg2ts">[MPEG2TS] <dd><a href="https://www.iso.org/standard/75928.html">Information technology  Generic coding of moving pictures and associated audio information  Part 1: Systems</a>. June 2019. Published. URL: <a href="https://www.iso.org/standard/75928.html">https://www.iso.org/standard/75928.html</a> <dt id="biblio-rfc2119">[RFC2119] <dd>S. Bradner. <a href="https://tools.ietf.org/html/rfc2119">Key words for use in RFCs to Indicate Requirement Levels</a>. March 1997. Best Current Practice. URL: <a href="https://tools.ietf.org/html/rfc2119">https://tools.ietf.org/html/rfc2119</a> <dt id="biblio-rfc7232">[RFC7232] <dd>R. Fielding, Ed.; J. Reschke, Ed.. <a href="https://httpwg.org/specs/rfc7232.html">Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</a>. June 2014. Proposed Standard. URL: <a href="https://httpwg.org/specs/rfc7232.html">https://httpwg.org/specs/rfc7232.html</a> <dt id="biblio-rfc7233">[RFC7233] <dd>R. Fielding, Ed.; Y. Lafon, Ed.; J. Reschke, Ed.. <a href="https://httpwg.org/specs/rfc7233.html">Hypertext Transfer Protocol (HTTP/1.1): Range Requests</a>. June 2014. Proposed Standard. URL: <a href="https://httpwg.org/specs/rfc7233.html">https://httpwg.org/specs/rfc7233.html</a> </dl> <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3> <dl> <dt id="biblio-atsc3">[ATSC3] <dd><a href="https://https://www.atsc.org/wp-content/uploads/2017/10/A300-2017-ATSC-3-System-Standard-1.pdf">ATSC Standard: A/300:2017  ATSC3.0 System </a>. URL: <a href="https://https://www.atsc.org/wp-content/uploads/2017/10/A300-2017-ATSC-3-System-Standard-1.pdf">https://https://www.atsc.org/wp-content/uploads/2017/10/A300-2017-ATSC-3-System-Standard-1.pdf</a> <dt id="biblio-dvb-dash">[DVB-DASH] <dd><a href="http://www.etsi.org/deliver/etsi_ts/103200_103299/103285/01.02.01_60/ts_103285v010201p.pdf">ETSI TS 103 285 V1.2.1 (2018-03): Digital Video Broadcasting (DVB); MPEG-DASH Profile for Transport of ISO BMFF Based DVB Services over IP Based Networks</a>. March 2018. Published. URL: <a href="http://www.etsi.org/deliver/etsi_ts/103200_103299/103285/01.02.01_60/ts_103285v010201p.pdf">http://www.etsi.org/deliver/etsi_ts/103200_103299/103285/01.02.01_60/ts_103285v010201p.pdf</a> <dt id="biblio-ecmascript">[ECMASCRIPT] <dd><a href="https://tc39.es/ecma262/">ECMAScript Language Specification</a>. URL: <a href="https://tc39.es/ecma262/">https://tc39.es/ecma262/</a> <dt id="biblio-encrypted-media">[ENCRYPTED-MEDIA] <dd>David Dorwin; et al. <a href="https://www.w3.org/TR/encrypted-media/">Encrypted Media Extensions</a>. 18 September 2017. REC. URL: <a href="https://www.w3.org/TR/encrypted-media/">https://www.w3.org/TR/encrypted-media/</a> <dt id="biblio-hls">[HLS] <dd>R. Pantos, Ed.; W. May. <a href="https://tools.ietf.org/html/rfc8216">HTTP Live Streaming</a>. August 2017. Informational. URL: <a href="https://tools.ietf.org/html/rfc8216">https://tools.ietf.org/html/rfc8216</a> <dt id="biblio-leap-seconds">[LEAP-SECONDS] <dd><a href="https://datacenter.iers.org/data/latestVersion/16_BULLETIN_C16.txt">IERS Bulletin C (leap second announcements)</a>. URL: <a href="https://datacenter.iers.org/data/latestVersion/16_BULLETIN_C16.txt">https://datacenter.iers.org/data/latestVersion/16_BULLETIN_C16.txt</a> <dt id="biblio-media-source">[MEDIA-SOURCE] <dd>Matthew Wolenetz; et al. <a href="https://www.w3.org/TR/media-source/">Media Source Extensions"!</a>. 17 November 2016. REC. URL: <a href="https://www.w3.org/TR/media-source/">https://www.w3.org/TR/media-source/</a> </dl> <h2 class="no-num no-ref heading settled" id="issues-index"><span class="content">Issues Index</span><a class="self-link" href="#issues-index"></a></h2> <div style="counter-reset:issue"> <div class="issue"> We could benefit from some detailed examples here, especially as clock sync is such a critical element of live services.<a href="#issue-2e018246"> �! </a></div> <div class="issue"> Can we recommend some meaningful algorithm for this? Something to use as a starting point would be nice to provide.<a href="#issue-b0845db9"> �! </a></div> <div class="issue"> We need to clarify how to determine the right value for <code class="highlight">SAP_type</code> <a href="https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/235">GitHub #235</a>.<a href="#issue-2b342bfc"> �! </a></div> </div> <aside class="dfn-panel" data-for="presentation"> <b><a href="#presentation">#presentation</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-presentation">4.1. Structure of a DASH presentation</a> <a href="#ref-for-presentation`$">(2)</a> <li><a href="#ref-for-presentationa$">4.2. Terminology cross-reference across standards</a> <li><a href="#ref-for-presentationb$">4.3. Terminology choices in this document</a> <a href="#ref-for-presentationc$">(2)</a> <li><a href="#ref-for-presentationd$">5. Goal of the interoperable timing model</a> <li><a href="#ref-for-presentatione$">6. MPD timeline</a> <a href="#ref-for-presentationf$">(2)</a> <li><a href="#ref-for-presentationg$">7. Presentation timing characteristics</a> <a href="#ref-for-presentationh$">(2)</a> <a href="#ref-for-presentation`$�$">(3)</a> <a href="#ref-for-presentation`$`$">(4)</a> <li><a href="#ref-for-presentation`$a$">8. Period timing</a> <li><a href="#ref-for-presentation`$b$">9.2. Referencing media segments</a> <li><a href="#ref-for-presentation`$c$">10.1. Workarounds for clock drift</a> <a href="#ref-for-presentation`$d$">(2)</a> <a href="#ref-for-presentation`$e$">(3)</a> <li><a href="#ref-for-presentation`$f$">13.2. Leap seconds</a> <li><a href="#ref-for-presentation`$g$">13.4. Time shift buffer</a> <li><a href="#ref-for-presentation`$h$">13.6. MPD updates</a> <li><a href="#ref-for-presentationa$�$">13.6.1. MPD snapshot validity</a> <li><a href="#ref-for-presentationa$`$">18.4.2. Moving the period start point (simple addressing)</a> </ul> </aside> <aside class="dfn-panel" data-for="mpd"> <b><a href="#mpd">#mpd</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-mpd">4.1. Structure of a DASH presentation</a> <li><a href="#ref-for-mpd`$">4.3. Terminology choices in this document</a> <a href="#ref-for-mpda$">(2)</a> <li><a href="#ref-for-mpdb$">6. MPD timeline</a> <a href="#ref-for-mpdc$">(2)</a> <a href="#ref-for-mpdd$">(3)</a> <a href="#ref-for-mpde$">(4)</a> <a href="#ref-for-mpdf$">(5)</a> <a href="#ref-for-mpdg$">(6)</a> <a href="#ref-for-mpdh$">(7)</a> <li><a href="#ref-for-mpd`$�$">7. Presentation timing characteristics</a> <a href="#ref-for-mpd`$`$">(2)</a> <li><a href="#ref-for-mpd`$a$">8. Period timing</a> <a href="#ref-for-mpd`$b$">(2)</a> <a href="#ref-for-mpd`$c$">(3)</a> <a href="#ref-for-mpd`$d$">(4)</a> <a href="#ref-for-mpd`$e$">(5)</a> <a href="#ref-for-mpd`$f$">(6)</a> <li><a href="#ref-for-mpd`$g$">8.2. First and last period timing in dynamic presentations</a> <a href="#ref-for-mpd`$h$">(2)</a> <a href="#ref-for-mpda$�$">(3)</a> <a href="#ref-for-mpda$`$">(4)</a> <a href="#ref-for-mpda$a$">(5)</a> <a href="#ref-for-mpda$b$">(6)</a> <li><a href="#ref-for-mpda$c$">9. Representation timing</a> <a href="#ref-for-mpda$d$">(2)</a> <a href="#ref-for-mpda$e$">(3)</a> <a href="#ref-for-mpda$f$">(4)</a> <a href="#ref-for-mpda$g$">(5)</a> <li><a href="#ref-for-mpda$h$">9.1. Sample timeline</a> <a href="#ref-for-mpdb$�$">(2)</a> <li><a href="#ref-for-mpdb$`$">9.2.3. Removal of unnecessary segment references</a> <a href="#ref-for-mpdb$a$">(2)</a> <li><a href="#ref-for-mpdb$b$">11. Media segments</a> <a href="#ref-for-mpdb$c$">(2)</a> <a href="#ref-for-mpdb$d$">(3)</a> <li><a href="#ref-for-mpdb$e$">12. Period connectivity</a> <a href="#ref-for-mpdb$f$">(2)</a> <a href="#ref-for-mpdb$g$">(3)</a> <li><a href="#ref-for-mpdb$h$">13. Dynamic presentations</a> <a href="#ref-for-mpdc$�$">(2)</a> <a href="#ref-for-mpdc$`$">(3)</a> <a href="#ref-for-mpdc$a$">(4)</a> <a href="#ref-for-mpdc$b$">(5)</a> <a href="#ref-for-mpdc$c$">(6)</a> <a href="#ref-for-mpdc$d$">(7)</a> <a href="#ref-for-mpdc$e$">(8)</a> <a href="#ref-for-mpdc$f$">(9)</a> <li><a href="#ref-for-mpdc$g$">13.1. Clock synchronization</a> <a href="#ref-for-mpdc$h$">(2)</a> <a href="#ref-for-mpdd$�$">(3)</a> <a href="#ref-for-mpdd$`$">(4)</a> <li><a href="#ref-for-mpdd$a$">13.2. Leap seconds</a> <a href="#ref-for-mpdd$b$">(2)</a> <a href="#ref-for-mpdd$c$">(3)</a> <li><a href="#ref-for-mpdd$d$">13.3. Availability</a> <a href="#ref-for-mpdd$e$">(2)</a> <a href="#ref-for-mpdd$f$">(3)</a> <a href="#ref-for-mpdd$g$">(4)</a> <a href="#ref-for-mpdd$h$">(5)</a> <a href="#ref-for-mpde$�$">(6)</a> <li><a href="#ref-for-mpde$`$">13.4. Time shift buffer</a> <li><a href="#ref-for-mpde$a$">13.5. Presentation delay</a> <a href="#ref-for-mpde$b$">(2)</a> <li><a href="#ref-for-mpde$c$">13.6. MPD updates</a> <a href="#ref-for-mpde$d$">(2)</a> <a href="#ref-for-mpde$e$">(3)</a> <a href="#ref-for-mpde$f$">(4)</a> <a href="#ref-for-mpde$g$">(5)</a> <a href="#ref-for-mpde$h$">(6)</a> <li><a href="#ref-for-mpdf$�$">13.6.1. MPD snapshot validity</a> <a href="#ref-for-mpdf$`$">(2)</a> <a href="#ref-for-mpdf$a$">(3)</a> <a href="#ref-for-mpdf$b$">(4)</a> <a href="#ref-for-mpdf$c$">(5)</a> <a href="#ref-for-mpdf$d$">(6)</a> <a href="#ref-for-mpdf$e$">(7)</a> <a href="#ref-for-mpdf$f$">(8)</a> <a href="#ref-for-mpdf$g$">(9)</a> <a href="#ref-for-mpdf$h$">(10)</a> <a href="#ref-for-mpdg$�$">(11)</a> <a href="#ref-for-mpdg$`$">(12)</a> <li><a href="#ref-for-mpdg$a$">13.6.1.1. In-band MPD validity events</a> <a href="#ref-for-mpdg$b$">(2)</a> <a href="#ref-for-mpdg$c$">(3)</a> <a href="#ref-for-mpdg$d$">(4)</a> <a href="#ref-for-mpdg$e$">(5)</a> <a href="#ref-for-mpdg$f$">(6)</a> <a href="#ref-for-mpdg$g$">(7)</a> <a href="#ref-for-mpdg$h$">(8)</a> <li><a href="#ref-for-mpdh$�$">13.6.2. Adding content to the MPD</a> <a href="#ref-for-mpdh$`$">(2)</a> <a href="#ref-for-mpdh$a$">(3)</a> <li><a href="#ref-for-mpdh$b$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-mpdh$c$">(2)</a> <a href="#ref-for-mpdh$d$">(3)</a> <a href="#ref-for-mpdh$e$">(4)</a> <a href="#ref-for-mpdh$f$">(5)</a> <a href="#ref-for-mpdh$g$">(6)</a> <a href="#ref-for-mpdh$h$">(7)</a> <a href="#ref-for-mpd`$�$�$">(8)</a> <a href="#ref-for-mpd`$�$`$">(9)</a> <a href="#ref-for-mpd`$�$a$">(10)</a> <a href="#ref-for-mpd`$�$b$">(11)</a> <a href="#ref-for-mpd`$�$c$">(12)</a> <li><a href="#ref-for-mpd`$�$d$">13.6.4. End of live content</a> <a href="#ref-for-mpd`$�$e$">(2)</a> <a href="#ref-for-mpd`$�$f$">(3)</a> <a href="#ref-for-mpd`$�$g$">(4)</a> <a href="#ref-for-mpd`$�$h$">(5)</a> <a href="#ref-for-mpd`$`$�$">(6)</a> <a href="#ref-for-mpd`$`$`$">(7)</a> <a href="#ref-for-mpd`$`$a$">(8)</a> <li><a href="#ref-for-mpd`$`$b$">13.7. MPD refreshes</a> <a href="#ref-for-mpd`$`$c$">(2)</a> <a href="#ref-for-mpd`$`$d$">(3)</a> <a href="#ref-for-mpd`$`$e$">(4)</a> <a href="#ref-for-mpd`$`$f$">(5)</a> <a href="#ref-for-mpd`$`$g$">(6)</a> <a href="#ref-for-mpd`$`$h$">(7)</a> <a href="#ref-for-mpd`$a$�$">(8)</a> <li><a href="#ref-for-mpd`$a$`$">13.7.1. Conditional MPD downloads</a> <a href="#ref-for-mpd`$a$a$">(2)</a> <li><a href="#ref-for-mpd`$a$b$">15. Timing of stand-alone IMSC1 and WebVTT text files</a> <li><a href="#ref-for-mpd`$a$c$">18.1. Indexed addressing</a> <a href="#ref-for-mpd`$a$d$">(2)</a> <a href="#ref-for-mpd`$a$e$">(3)</a> <a href="#ref-for-mpd`$a$f$">(4)</a> <a href="#ref-for-mpd`$a$g$">(5)</a> <li><a href="#ref-for-mpd`$a$h$">18.2. Structure of the index segment</a> <li><a href="#ref-for-mpd`$b$�$">18.3. Explicit addressing</a> <a href="#ref-for-mpd`$b$`$">(2)</a> <a href="#ref-for-mpd`$b$a$">(3)</a> <a href="#ref-for-mpd`$b$b$">(4)</a> <a href="#ref-for-mpd`$b$c$">(5)</a> <a href="#ref-for-mpd`$b$d$">(6)</a> <a href="#ref-for-mpd`$b$e$">(7)</a> <li><a href="#ref-for-mpd`$b$f$">18.4. Simple addressing</a> <a href="#ref-for-mpd`$b$g$">(2)</a> <a href="#ref-for-mpd`$b$h$">(3)</a> <a href="#ref-for-mpd`$c$�$">(4)</a> <a href="#ref-for-mpd`$c$`$">(5)</a> <a href="#ref-for-mpd`$c$a$">(6)</a> <li><a href="#ref-for-mpd`$c$b$">18.4.1. Inaccuracy in media segment timing when using simple addressing</a> <a href="#ref-for-mpd`$c$c$">(2)</a> <li><a href="#ref-for-mpd`$c$d$">18.4.3. Converting simple addressing to explicit addressing</a> <a href="#ref-for-mpd`$c$e$">(2)</a> <a href="#ref-for-mpd`$c$f$">(3)</a> <a href="#ref-for-mpd`$c$g$">(4)</a> <li><a href="#ref-for-mpd`$c$h$">20. Representing durations in XML</a> <a href="#ref-for-mpd`$d$�$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="mpd-timeline"> <b><a href="#mpd-timeline">#mpd-timeline</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-mpd-timeline">4.3. Terminology choices in this document</a> <a href="#ref-for-mpd-timeline`$">(2)</a> <li><a href="#ref-for-mpd-timelinea$">6. MPD timeline</a> <a href="#ref-for-mpd-timelineb$">(2)</a> <a href="#ref-for-mpd-timelinec$">(3)</a> <a href="#ref-for-mpd-timelined$">(4)</a> <a href="#ref-for-mpd-timelinee$">(5)</a> <a href="#ref-for-mpd-timelinef$">(6)</a> <li><a href="#ref-for-mpd-timelineg$">7. Presentation timing characteristics</a> <a href="#ref-for-mpd-timelineh$">(2)</a> <a href="#ref-for-mpd-timeline`$�$">(3)</a> <a href="#ref-for-mpd-timeline`$`$">(4)</a> <a href="#ref-for-mpd-timeline`$a$">(5)</a> <li><a href="#ref-for-mpd-timeline`$b$">8. Period timing</a> <a href="#ref-for-mpd-timeline`$c$">(2)</a> <a href="#ref-for-mpd-timeline`$d$">(3)</a> <li><a href="#ref-for-mpd-timeline`$e$">8.1. First and last period timing in static presentations</a> <li><a href="#ref-for-mpd-timeline`$f$">8.2. First and last period timing in dynamic presentations</a> <li><a href="#ref-for-mpd-timeline`$g$">9.1. Sample timeline</a> <a href="#ref-for-mpd-timeline`$h$">(2)</a> <a href="#ref-for-mpd-timelinea$�$">(3)</a> <a href="#ref-for-mpd-timelinea$`$">(4)</a> <a href="#ref-for-mpd-timelinea$a$">(5)</a> <a href="#ref-for-mpd-timelinea$b$">(6)</a> <a href="#ref-for-mpd-timelinea$c$">(7)</a> <a href="#ref-for-mpd-timelinea$d$">(8)</a> <li><a href="#ref-for-mpd-timelinea$e$">9.3. Alignment of periods and representations</a> <li><a href="#ref-for-mpd-timelinea$f$">10. Clock drift is forbidden</a> <li><a href="#ref-for-mpd-timelinea$g$">11. Media segments</a> <li><a href="#ref-for-mpd-timelinea$h$">13.1. Clock synchronization</a> <li><a href="#ref-for-mpd-timelineb$�$">13.2. Leap seconds</a> <li><a href="#ref-for-mpd-timelineb$`$">13.3. Availability</a> <li><a href="#ref-for-mpd-timelineb$a$">13.4. Time shift buffer</a> <a href="#ref-for-mpd-timelineb$b$">(2)</a> <a href="#ref-for-mpd-timelineb$c$">(3)</a> <a href="#ref-for-mpd-timelineb$d$">(4)</a> <li><a href="#ref-for-mpd-timelineb$e$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-mpd-timelineb$f$">(2)</a> <li><a href="#ref-for-mpd-timelineb$g$">19. Large timescales and time values</a> </ul> </aside> <aside class="dfn-panel" data-for="static-presentation"> <b><a href="#static-presentation">#static-presentation</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-static-presentation">7. Presentation timing characteristics</a> <li><a href="#ref-for-static-presentation`$">8.1. First and last period timing in static presentations</a> <a href="#ref-for-static-presentationa$">(2)</a> <li><a href="#ref-for-static-presentationb$">9.2.1. Necessary segment references in static presentations</a> <a href="#ref-for-static-presentationc$">(2)</a> <li><a href="#ref-for-static-presentationd$">9.2.3. Removal of unnecessary segment references</a> <li><a href="#ref-for-static-presentatione$">13. Dynamic presentations</a> <li><a href="#ref-for-static-presentationf$">13.6. MPD updates</a> <li><a href="#ref-for-static-presentationg$">13.6.4. End of live content</a> <a href="#ref-for-static-presentationh$">(2)</a> <a href="#ref-for-static-presentation`$�$">(3)</a> <a href="#ref-for-static-presentation`$`$">(4)</a> <a href="#ref-for-static-presentation`$a$">(5)</a> <a href="#ref-for-static-presentation`$b$">(6)</a> <a href="#ref-for-static-presentation`$c$">(7)</a> </ul> </aside> <aside class="dfn-panel" data-for="dynamic-presentation"> <b><a href="#dynamic-presentation">#dynamic-presentation</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-dynamic-presentation">7. Presentation timing characteristics</a> <li><a href="#ref-for-dynamic-presentation`$">8.2. First and last period timing in dynamic presentations</a> <a href="#ref-for-dynamic-presentationa$">(2)</a> <a href="#ref-for-dynamic-presentationb$">(3)</a> <li><a href="#ref-for-dynamic-presentationc$">9.2.2. Necessary segment references in dynamic presentations</a> <a href="#ref-for-dynamic-presentationd$">(2)</a> <li><a href="#ref-for-dynamic-presentatione$">9.2.3. Removal of unnecessary segment references</a> <li><a href="#ref-for-dynamic-presentationf$">9.3. Alignment of periods and representations</a> <li><a href="#ref-for-dynamic-presentationg$">13. Dynamic presentations</a> <a href="#ref-for-dynamic-presentationh$">(2)</a> <a href="#ref-for-dynamic-presentation`$�$">(3)</a> <a href="#ref-for-dynamic-presentation`$`$">(4)</a> <a href="#ref-for-dynamic-presentation`$a$">(5)</a> <a href="#ref-for-dynamic-presentation`$b$">(6)</a> <li><a href="#ref-for-dynamic-presentation`$c$">13.1. Clock synchronization</a> <a href="#ref-for-dynamic-presentation`$d$">(2)</a> <a href="#ref-for-dynamic-presentation`$e$">(3)</a> <a href="#ref-for-dynamic-presentation`$f$">(4)</a> <a href="#ref-for-dynamic-presentation`$g$">(5)</a> <li><a href="#ref-for-dynamic-presentation`$h$">13.2. Leap seconds</a> <a href="#ref-for-dynamic-presentationa$�$">(2)</a> <li><a href="#ref-for-dynamic-presentationa$`$">13.3. Availability</a> <li><a href="#ref-for-dynamic-presentationa$a$">13.4. Time shift buffer</a> <a href="#ref-for-dynamic-presentationa$b$">(2)</a> <li><a href="#ref-for-dynamic-presentationa$c$">13.6. MPD updates</a> <a href="#ref-for-dynamic-presentationa$d$">(2)</a> <li><a href="#ref-for-dynamic-presentationa$e$">13.6.1. MPD snapshot validity</a> <a href="#ref-for-dynamic-presentationa$f$">(2)</a> <a href="#ref-for-dynamic-presentationa$g$">(3)</a> <li><a href="#ref-for-dynamic-presentationa$h$">13.6.4. End of live content</a> <a href="#ref-for-dynamic-presentationb$�$">(2)</a> <a href="#ref-for-dynamic-presentationb$`$">(3)</a> <a href="#ref-for-dynamic-presentationb$a$">(4)</a> <a href="#ref-for-dynamic-presentationb$b$">(5)</a> <li><a href="#ref-for-dynamic-presentationb$c$">13.7. MPD refreshes</a> </ul> </aside> <aside class="dfn-panel" data-for="effective-availability-start-time"> <b><a href="#effective-availability-start-time">#effective-availability-start-time</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-effective-availability-start-time">13.2. Leap seconds</a> <li><a href="#ref-for-effective-availability-start-time`$">13.3. Availability</a> <li><a href="#ref-for-effective-availability-start-timea$">13.4. Time shift buffer</a> <a href="#ref-for-effective-availability-start-timeb$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="periods"> <b><a href="#periods">#periods</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-periods">6. MPD timeline</a> <a href="#ref-for-periods`$">(2)</a> <a href="#ref-for-periodsa$">(3)</a> <a href="#ref-for-periodsb$">(4)</a> <a href="#ref-for-periodsc$">(5)</a> <li><a href="#ref-for-periodsd$">7. Presentation timing characteristics</a> <a href="#ref-for-periodse$">(2)</a> <a href="#ref-for-periodsf$">(3)</a> <a href="#ref-for-periodsg$">(4)</a> <a href="#ref-for-periodsh$">(5)</a> <li><a href="#ref-for-periods`$�$">8. Period timing</a> <a href="#ref-for-periods`$`$">(2)</a> <a href="#ref-for-periods`$a$">(3)</a> <a href="#ref-for-periods`$b$">(4)</a> <a href="#ref-for-periods`$c$">(5)</a> <a href="#ref-for-periods`$d$">(6)</a> <a href="#ref-for-periods`$e$">(7)</a> <a href="#ref-for-periods`$f$">(8)</a> <a href="#ref-for-periods`$g$">(9)</a> <a href="#ref-for-periods`$h$">(10)</a> <a href="#ref-for-periodsa$�$">(11)</a> <a href="#ref-for-periodsa$`$">(12)</a> <a href="#ref-for-periodsa$a$">(13)</a> <a href="#ref-for-periodsa$b$">(14)</a> <a href="#ref-for-periodsa$c$">(15)</a> <a href="#ref-for-periodsa$d$">(16)</a> <a href="#ref-for-periodsa$e$">(17)</a> <a href="#ref-for-periodsa$f$">(18)</a> <a href="#ref-for-periodsa$g$">(19)</a> <li><a href="#ref-for-periodsa$h$">8.1. First and last period timing in static presentations</a> <a href="#ref-for-periodsb$�$">(2)</a> <li><a href="#ref-for-periodsb$`$">8.2. First and last period timing in dynamic presentations</a> <a href="#ref-for-periodsb$a$">(2)</a> <a href="#ref-for-periodsb$b$">(3)</a> <a href="#ref-for-periodsb$c$">(4)</a> <a href="#ref-for-periodsb$d$">(5)</a> <a href="#ref-for-periodsb$e$">(6)</a> <li><a href="#ref-for-periodsb$f$">9. Representation timing</a> <a href="#ref-for-periodsb$g$">(2)</a> <a href="#ref-for-periodsb$h$">(3)</a> <a href="#ref-for-periodsc$�$">(4)</a> <li><a href="#ref-for-periodsc$`$">9.1. Sample timeline</a> <a href="#ref-for-periodsc$a$">(2)</a> <a href="#ref-for-periodsc$b$">(3)</a> <a href="#ref-for-periodsc$c$">(4)</a> <a href="#ref-for-periodsc$d$">(5)</a> <li><a href="#ref-for-periodsc$e$">9.2. Referencing media segments</a> <li><a href="#ref-for-periodsc$f$">9.2.1. Necessary segment references in static presentations</a> <a href="#ref-for-periodsc$g$">(2)</a> <li><a href="#ref-for-periodsc$h$">9.2.2. Necessary segment references in dynamic presentations</a> <a href="#ref-for-periodsd$�$">(2)</a> <a href="#ref-for-periodsd$`$">(3)</a> <a href="#ref-for-periodsd$a$">(4)</a> <a href="#ref-for-periodsd$b$">(5)</a> <li><a href="#ref-for-periodsd$c$">9.3. Alignment of periods and representations</a> <a href="#ref-for-periodsd$d$">(2)</a> <a href="#ref-for-periodsd$e$">(3)</a> <a href="#ref-for-periodsd$f$">(4)</a> <a href="#ref-for-periodsd$g$">(5)</a> <a href="#ref-for-periodsd$h$">(6)</a> <a href="#ref-for-periodse$�$">(7)</a> <a href="#ref-for-periodse$`$">(8)</a> <a href="#ref-for-periodse$a$">(9)</a> <a href="#ref-for-periodse$b$">(10)</a> <a href="#ref-for-periodse$c$">(11)</a> <a href="#ref-for-periodse$d$">(12)</a> <a href="#ref-for-periodse$e$">(13)</a> <a href="#ref-for-periodse$f$">(14)</a> <a href="#ref-for-periodse$g$">(15)</a> <li><a href="#ref-for-periodse$h$">10.1. Workarounds for clock drift</a> <li><a href="#ref-for-periodsf$�$">12. Period connectivity</a> <a href="#ref-for-periodsf$`$">(2)</a> <a href="#ref-for-periodsf$a$">(3)</a> <a href="#ref-for-periodsf$b$">(4)</a> <a href="#ref-for-periodsf$c$">(5)</a> <a href="#ref-for-periodsf$d$">(6)</a> <a href="#ref-for-periodsf$e$">(7)</a> <a href="#ref-for-periodsf$f$">(8)</a> <a href="#ref-for-periodsf$g$">(9)</a> <a href="#ref-for-periodsf$h$">(10)</a> <li><a href="#ref-for-periodsg$�$">12.1. Segment reference duplication during connected period transitions</a> <a href="#ref-for-periodsg$`$">(2)</a> <a href="#ref-for-periodsg$a$">(3)</a> <a href="#ref-for-periodsg$b$">(4)</a> <a href="#ref-for-periodsg$c$">(5)</a> <a href="#ref-for-periodsg$d$">(6)</a> <a href="#ref-for-periodsg$e$">(7)</a> <a href="#ref-for-periodsg$f$">(8)</a> <li><a href="#ref-for-periodsg$g$">12.2. Period continuity</a> <a href="#ref-for-periodsg$h$">(2)</a> <a href="#ref-for-periodsh$�$">(3)</a> <a href="#ref-for-periodsh$`$">(4)</a> <a href="#ref-for-periodsh$a$">(5)</a> <a href="#ref-for-periodsh$b$">(6)</a> <a href="#ref-for-periodsh$c$">(7)</a> <a href="#ref-for-periodsh$d$">(8)</a> <a href="#ref-for-periodsh$e$">(9)</a> <a href="#ref-for-periodsh$f$">(10)</a> <a href="#ref-for-periodsh$g$">(11)</a> <a href="#ref-for-periodsh$h$">(12)</a> <li><a href="#ref-for-periods`$�$�$">13. Dynamic presentations</a> <a href="#ref-for-periods`$�$`$">(2)</a> <a href="#ref-for-periods`$�$a$">(3)</a> <li><a href="#ref-for-periods`$�$b$">13.3. Availability</a> <li><a href="#ref-for-periods`$�$c$">13.4. Time shift buffer</a> <a href="#ref-for-periods`$�$d$">(2)</a> <a href="#ref-for-periods`$�$e$">(3)</a> <a href="#ref-for-periods`$�$f$">(4)</a> <a href="#ref-for-periods`$�$g$">(5)</a> <li><a href="#ref-for-periods`$�$h$">13.5. Presentation delay</a> <li><a href="#ref-for-periods`$`$�$">13.6. MPD updates</a> <a href="#ref-for-periods`$`$`$">(2)</a> <a href="#ref-for-periods`$`$a$">(3)</a> <a href="#ref-for-periods`$`$b$">(4)</a> <a href="#ref-for-periods`$`$c$">(5)</a> <a href="#ref-for-periods`$`$d$">(6)</a> <a href="#ref-for-periods`$`$e$">(7)</a> <a href="#ref-for-periods`$`$f$">(8)</a> <li><a href="#ref-for-periods`$`$g$">13.6.2. Adding content to the MPD</a> <a href="#ref-for-periods`$`$h$">(2)</a> <a href="#ref-for-periods`$a$�$">(3)</a> <a href="#ref-for-periods`$a$`$">(4)</a> <a href="#ref-for-periods`$a$a$">(5)</a> <a href="#ref-for-periods`$a$b$">(6)</a> <a href="#ref-for-periods`$a$c$">(7)</a> <a href="#ref-for-periods`$a$d$">(8)</a> <a href="#ref-for-periods`$a$e$">(9)</a> <a href="#ref-for-periods`$a$f$">(10)</a> <a href="#ref-for-periods`$a$g$">(11)</a> <a href="#ref-for-periods`$a$h$">(12)</a> <li><a href="#ref-for-periods`$b$�$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-periods`$b$`$">(2)</a> <a href="#ref-for-periods`$b$a$">(3)</a> <a href="#ref-for-periods`$b$b$">(4)</a> <a href="#ref-for-periods`$b$c$">(5)</a> <a href="#ref-for-periods`$b$d$">(6)</a> <li><a href="#ref-for-periods`$b$e$">13.6.4. End of live content</a> <li><a href="#ref-for-periods`$b$f$">13.7.1. Conditional MPD downloads</a> <li><a href="#ref-for-periods`$b$g$">14. Segment loss handling</a> <a href="#ref-for-periods`$b$h$">(2)</a> <a href="#ref-for-periods`$c$�$">(3)</a> <a href="#ref-for-periods`$c$`$">(4)</a> <li><a href="#ref-for-periods`$c$a$">15. Timing of stand-alone IMSC1 and WebVTT text files</a> <li><a href="#ref-for-periods`$c$b$">17.1. Offer content with imperfectly aligned tracks</a> <a href="#ref-for-periods`$c$c$">(2)</a> <a href="#ref-for-periods`$c$d$">(3)</a> <a href="#ref-for-periods`$c$e$">(4)</a> <a href="#ref-for-periods`$c$f$">(5)</a> <a href="#ref-for-periods`$c$g$">(6)</a> <a href="#ref-for-periods`$c$h$">(7)</a> <a href="#ref-for-periods`$d$�$">(8)</a> <a href="#ref-for-periods`$d$`$">(9)</a> <a href="#ref-for-periods`$d$a$">(10)</a> <a href="#ref-for-periods`$d$b$">(11)</a> <a href="#ref-for-periods`$d$c$">(12)</a> <li><a href="#ref-for-periods`$d$d$">17.2. Split a period</a> <a href="#ref-for-periods`$d$e$">(2)</a> <a href="#ref-for-periods`$d$f$">(3)</a> <a href="#ref-for-periods`$d$g$">(4)</a> <a href="#ref-for-periods`$d$h$">(5)</a> <a href="#ref-for-periods`$e$�$">(6)</a> <a href="#ref-for-periods`$e$`$">(7)</a> <a href="#ref-for-periods`$e$a$">(8)</a> <a href="#ref-for-periods`$e$b$">(9)</a> <a href="#ref-for-periods`$e$c$">(10)</a> <a href="#ref-for-periods`$e$d$">(11)</a> <a href="#ref-for-periods`$e$e$">(12)</a> <a href="#ref-for-periods`$e$f$">(13)</a> <a href="#ref-for-periods`$e$g$">(14)</a> <a href="#ref-for-periods`$e$h$">(15)</a> <a href="#ref-for-periods`$f$�$">(16)</a> <a href="#ref-for-periods`$f$`$">(17)</a> <a href="#ref-for-periods`$f$a$">(18)</a> <a href="#ref-for-periods`$f$b$">(19)</a> <a href="#ref-for-periods`$f$c$">(20)</a> <a href="#ref-for-periods`$f$d$">(21)</a> <a href="#ref-for-periods`$f$e$">(22)</a> <a href="#ref-for-periods`$f$f$">(23)</a> <li><a href="#ref-for-periods`$f$g$">17.3. Change the default_KID</a> <a href="#ref-for-periods`$f$h$">(2)</a> <li><a href="#ref-for-periods`$g$�$">18. Segment addressing modes</a> <li><a href="#ref-for-periods`$g$`$">18.1. Indexed addressing</a> <li><a href="#ref-for-periods`$g$a$">18.2.1. Moving the period start point (indexed addressing)</a> <a href="#ref-for-periods`$g$b$">(2)</a> <a href="#ref-for-periods`$g$c$">(3)</a> <li><a href="#ref-for-periods`$g$d$">18.3. Explicit addressing</a> <a href="#ref-for-periods`$g$e$">(2)</a> <a href="#ref-for-periods`$g$f$">(3)</a> <a href="#ref-for-periods`$g$g$">(4)</a> <li><a href="#ref-for-periods`$g$h$">18.3.1. Moving the period start point (explicit addressing)</a> <a href="#ref-for-periods`$h$�$">(2)</a> <a href="#ref-for-periods`$h$`$">(3)</a> <li><a href="#ref-for-periods`$h$a$">18.4. Simple addressing</a> <a href="#ref-for-periods`$h$b$">(2)</a> <a href="#ref-for-periods`$h$c$">(3)</a> <a href="#ref-for-periods`$h$d$">(4)</a> <a href="#ref-for-periods`$h$e$">(5)</a> <a href="#ref-for-periods`$h$f$">(6)</a> <a href="#ref-for-periods`$h$g$">(7)</a> <a href="#ref-for-periods`$h$h$">(8)</a> <li><a href="#ref-for-periodsa$�$�$">18.4.1. Inaccuracy in media segment timing when using simple addressing</a> <a href="#ref-for-periodsa$�$`$">(2)</a> <a href="#ref-for-periodsa$�$a$">(3)</a> <a href="#ref-for-periodsa$�$b$">(4)</a> <a href="#ref-for-periodsa$�$c$">(5)</a> <a href="#ref-for-periodsa$�$d$">(6)</a> <a href="#ref-for-periodsa$�$e$">(7)</a> <a href="#ref-for-periodsa$�$f$">(8)</a> <a href="#ref-for-periodsa$�$g$">(9)</a> <a href="#ref-for-periodsa$�$h$">(10)</a> <li><a href="#ref-for-periodsa$`$�$">18.4.2. Moving the period start point (simple addressing)</a> <a href="#ref-for-periodsa$`$`$">(2)</a> <a href="#ref-for-periodsa$`$a$">(3)</a> <a href="#ref-for-periodsa$`$b$">(4)</a> <a href="#ref-for-periodsa$`$c$">(5)</a> <a href="#ref-for-periodsa$`$d$">(6)</a> <a href="#ref-for-periodsa$`$e$">(7)</a> <a href="#ref-for-periodsa$`$f$">(8)</a> <a href="#ref-for-periodsa$`$g$">(9)</a> <a href="#ref-for-periodsa$`$h$">(10)</a> <a href="#ref-for-periodsa$a$�$">(11)</a> <a href="#ref-for-periodsa$a$`$">(12)</a> <a href="#ref-for-periodsa$a$a$">(13)</a> <a href="#ref-for-periodsa$a$b$">(14)</a> <a href="#ref-for-periodsa$a$c$">(15)</a> </ul> </aside> <aside class="dfn-panel" data-for="representations"> <b><a href="#representations">#representations</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-representations">4.1. Structure of a DASH presentation</a> <a href="#ref-for-representations`$">(2)</a> <a href="#ref-for-representationsa$">(3)</a> <li><a href="#ref-for-representationsb$">4.3. Terminology choices in this document</a> <a href="#ref-for-representationsc$">(2)</a> <a href="#ref-for-representationsd$">(3)</a> <a href="#ref-for-representationse$">(4)</a> <li><a href="#ref-for-representationsf$">6. MPD timeline</a> <a href="#ref-for-representationsg$">(2)</a> <a href="#ref-for-representationsh$">(3)</a> <a href="#ref-for-representations`$�$">(4)</a> <a href="#ref-for-representations`$`$">(5)</a> <li><a href="#ref-for-representations`$a$">8. Period timing</a> <li><a href="#ref-for-representations`$b$">9. Representation timing</a> <a href="#ref-for-representations`$c$">(2)</a> <a href="#ref-for-representations`$d$">(3)</a> <a href="#ref-for-representations`$e$">(4)</a> <a href="#ref-for-representations`$f$">(5)</a> <a href="#ref-for-representations`$g$">(6)</a> <a href="#ref-for-representations`$h$">(7)</a> <a href="#ref-for-representationsa$�$">(8)</a> <li><a href="#ref-for-representationsa$`$">9.1. Sample timeline</a> <a href="#ref-for-representationsa$a$">(2)</a> <a href="#ref-for-representationsa$b$">(3)</a> <a href="#ref-for-representationsa$c$">(4)</a> <a href="#ref-for-representationsa$d$">(5)</a> <a href="#ref-for-representationsa$e$">(6)</a> <li><a href="#ref-for-representationsa$f$">9.2. Referencing media segments</a> <a href="#ref-for-representationsa$g$">(2)</a> <a href="#ref-for-representationsa$h$">(3)</a> <li><a href="#ref-for-representationsb$�$">9.2.1. Necessary segment references in static presentations</a> <li><a href="#ref-for-representationsb$`$">9.2.2. Necessary segment references in dynamic presentations</a> <a href="#ref-for-representationsb$a$">(2)</a> <li><a href="#ref-for-representationsb$b$">9.2.3. Removal of unnecessary segment references</a> <li><a href="#ref-for-representationsb$c$">10.1. Workarounds for clock drift</a> <li><a href="#ref-for-representationsb$d$">11. Media segments</a> <a href="#ref-for-representationsb$e$">(2)</a> <li><a href="#ref-for-representationsb$f$">12. Period connectivity</a> <a href="#ref-for-representationsb$g$">(2)</a> <a href="#ref-for-representationsb$h$">(3)</a> <a href="#ref-for-representationsc$�$">(4)</a> <a href="#ref-for-representationsc$`$">(5)</a> <a href="#ref-for-representationsc$a$">(6)</a> <a href="#ref-for-representationsc$b$">(7)</a> <li><a href="#ref-for-representationsc$c$">12.2. Period continuity</a> <li><a href="#ref-for-representationsc$d$">13.3. Availability</a> <li><a href="#ref-for-representationsc$e$">13.5. Presentation delay</a> <a href="#ref-for-representationsc$f$">(2)</a> <a href="#ref-for-representationsc$g$">(3)</a> <li><a href="#ref-for-representationsc$h$">13.6. MPD updates</a> <a href="#ref-for-representationsd$�$">(2)</a> <a href="#ref-for-representationsd$`$">(3)</a> <li><a href="#ref-for-representationsd$a$">14. Segment loss handling</a> <a href="#ref-for-representationsd$b$">(2)</a> <a href="#ref-for-representationsd$c$">(3)</a> <a href="#ref-for-representationsd$d$">(4)</a> <a href="#ref-for-representationsd$e$">(5)</a> <a href="#ref-for-representationsd$f$">(6)</a> <a href="#ref-for-representationsd$g$">(7)</a> <a href="#ref-for-representationsd$h$">(8)</a> <li><a href="#ref-for-representationse$�$">16. Forbidden techniques</a> <li><a href="#ref-for-representationse$`$">17.1. Offer content with imperfectly aligned tracks</a> <a href="#ref-for-representationse$a$">(2)</a> <a href="#ref-for-representationse$b$">(3)</a> <a href="#ref-for-representationse$c$">(4)</a> <a href="#ref-for-representationse$d$">(5)</a> <li><a href="#ref-for-representationse$e$">17.2. Split a period</a> <a href="#ref-for-representationse$f$">(2)</a> <a href="#ref-for-representationse$g$">(3)</a> <a href="#ref-for-representationse$h$">(4)</a> <a href="#ref-for-representationsf$�$">(5)</a> <a href="#ref-for-representationsf$`$">(6)</a> <a href="#ref-for-representationsf$a$">(7)</a> <li><a href="#ref-for-representationsf$b$">17.3. Change the default_KID</a> <a href="#ref-for-representationsf$c$">(2)</a> <a href="#ref-for-representationsf$d$">(3)</a> <a href="#ref-for-representationsf$e$">(4)</a> <a href="#ref-for-representationsf$f$">(5)</a> <li><a href="#ref-for-representationsf$g$">18. Segment addressing modes</a> <a href="#ref-for-representationsf$h$">(2)</a> <a href="#ref-for-representationsg$�$">(3)</a> <li><a href="#ref-for-representationsg$`$">18.1. Indexed addressing</a> <a href="#ref-for-representationsg$a$">(2)</a> <a href="#ref-for-representationsg$b$">(3)</a> <li><a href="#ref-for-representationsg$c$">18.2. Structure of the index segment</a> <li><a href="#ref-for-representationsg$d$">18.2.1. Moving the period start point (indexed addressing)</a> <a href="#ref-for-representationsg$e$">(2)</a> <li><a href="#ref-for-representationsg$f$">18.3. Explicit addressing</a> <a href="#ref-for-representationsg$g$">(2)</a> <li><a href="#ref-for-representationsg$h$">18.3.1. Moving the period start point (explicit addressing)</a> <a href="#ref-for-representationsh$�$">(2)</a> <a href="#ref-for-representationsh$`$">(3)</a> <li><a href="#ref-for-representationsh$a$">18.4. Simple addressing</a> <li><a href="#ref-for-representationsh$b$">18.4.2. Moving the period start point (simple addressing)</a> <a href="#ref-for-representationsh$c$">(2)</a> <a href="#ref-for-representationsh$d$">(3)</a> <a href="#ref-for-representationsh$e$">(4)</a> <li><a href="#ref-for-representationsh$f$">18.4.3. Converting simple addressing to explicit addressing</a> <a href="#ref-for-representationsh$g$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="segment-references"> <b><a href="#segment-references">#segment-references</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-segment-references">6. MPD timeline</a> <li><a href="#ref-for-segment-references`$">9. Representation timing</a> <li><a href="#ref-for-segment-referencesa$">9.2. Referencing media segments</a> <a href="#ref-for-segment-referencesb$">(2)</a> <a href="#ref-for-segment-referencesc$">(3)</a> <li><a href="#ref-for-segment-referencesd$">9.2.2. Necessary segment references in dynamic presentations</a> <li><a href="#ref-for-segment-referencese$">9.2.3. Removal of unnecessary segment references</a> <a href="#ref-for-segment-referencesf$">(2)</a> <a href="#ref-for-segment-referencesg$">(3)</a> <a href="#ref-for-segment-referencesh$">(4)</a> <a href="#ref-for-segment-references`$�$">(5)</a> <a href="#ref-for-segment-references`$`$">(6)</a> <li><a href="#ref-for-segment-references`$a$">11. Media segments</a> <a href="#ref-for-segment-references`$b$">(2)</a> <a href="#ref-for-segment-references`$c$">(3)</a> <a href="#ref-for-segment-references`$d$">(4)</a> <a href="#ref-for-segment-references`$e$">(5)</a> <li><a href="#ref-for-segment-references`$f$">13.6. MPD updates</a> <a href="#ref-for-segment-references`$g$">(2)</a> <li><a href="#ref-for-segment-references`$h$">13.6.1. MPD snapshot validity</a> <a href="#ref-for-segment-referencesa$�$">(2)</a> <a href="#ref-for-segment-referencesa$`$">(3)</a> <li><a href="#ref-for-segment-referencesa$a$">13.6.2. Adding content to the MPD</a> <a href="#ref-for-segment-referencesa$b$">(2)</a> <a href="#ref-for-segment-referencesa$c$">(3)</a> <a href="#ref-for-segment-referencesa$d$">(4)</a> <a href="#ref-for-segment-referencesa$e$">(5)</a> <a href="#ref-for-segment-referencesa$f$">(6)</a> <a href="#ref-for-segment-referencesa$g$">(7)</a> <a href="#ref-for-segment-referencesa$h$">(8)</a> <a href="#ref-for-segment-referencesb$�$">(9)</a> <li><a href="#ref-for-segment-referencesb$`$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-segment-referencesb$a$">(2)</a> <a href="#ref-for-segment-referencesb$b$">(3)</a> <a href="#ref-for-segment-referencesb$c$">(4)</a> <a href="#ref-for-segment-referencesb$d$">(5)</a> <li><a href="#ref-for-segment-referencesb$e$">13.7. MPD refreshes</a> <li><a href="#ref-for-segment-referencesb$f$">13.7.1. Conditional MPD downloads</a> <li><a href="#ref-for-segment-referencesb$g$">18.3. Explicit addressing</a> <a href="#ref-for-segment-referencesb$h$">(2)</a> <a href="#ref-for-segment-referencesc$�$">(3)</a> <a href="#ref-for-segment-referencesc$`$">(4)</a> <a href="#ref-for-segment-referencesc$a$">(5)</a> <a href="#ref-for-segment-referencesc$b$">(6)</a> <a href="#ref-for-segment-referencesc$c$">(7)</a> <li><a href="#ref-for-segment-referencesc$d$">18.3.1. Moving the period start point (explicit addressing)</a> <li><a href="#ref-for-segment-referencesc$e$">18.4. Simple addressing</a> <a href="#ref-for-segment-referencesc$f$">(2)</a> <a href="#ref-for-segment-referencesc$g$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="sample-timeline"> <b><a href="#sample-timeline">#sample-timeline</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-sample-timeline">4.3. Terminology choices in this document</a> <li><a href="#ref-for-sample-timeline`$">6. MPD timeline</a> <li><a href="#ref-for-sample-timelinea$">9.1. Sample timeline</a> <a href="#ref-for-sample-timelineb$">(2)</a> <a href="#ref-for-sample-timelinec$">(3)</a> <a href="#ref-for-sample-timelined$">(4)</a> <a href="#ref-for-sample-timelinee$">(5)</a> <a href="#ref-for-sample-timelinef$">(6)</a> <a href="#ref-for-sample-timelineg$">(7)</a> <a href="#ref-for-sample-timelineh$">(8)</a> <a href="#ref-for-sample-timeline`$�$">(9)</a> <a href="#ref-for-sample-timeline`$`$">(10)</a> <a href="#ref-for-sample-timeline`$a$">(11)</a> <a href="#ref-for-sample-timeline`$b$">(12)</a> <a href="#ref-for-sample-timeline`$c$">(13)</a> <a href="#ref-for-sample-timeline`$d$">(14)</a> <a href="#ref-for-sample-timeline`$e$">(15)</a> <li><a href="#ref-for-sample-timeline`$f$">9.2. Referencing media segments</a> <li><a href="#ref-for-sample-timeline`$g$">10. Clock drift is forbidden</a> <li><a href="#ref-for-sample-timeline`$h$">11. Media segments</a> <a href="#ref-for-sample-timelinea$�$">(2)</a> <li><a href="#ref-for-sample-timelinea$`$">12. Period connectivity</a> <li><a href="#ref-for-sample-timelinea$a$">12.1. Segment reference duplication during connected period transitions</a> <li><a href="#ref-for-sample-timelinea$b$">18.1. Indexed addressing</a> <a href="#ref-for-sample-timelinea$c$">(2)</a> <li><a href="#ref-for-sample-timelinea$d$">18.2. Structure of the index segment</a> <li><a href="#ref-for-sample-timelinea$e$">18.2.1. Moving the period start point (indexed addressing)</a> <li><a href="#ref-for-sample-timelinea$f$">18.3. Explicit addressing</a> <a href="#ref-for-sample-timelinea$g$">(2)</a> <a href="#ref-for-sample-timelinea$h$">(3)</a> <a href="#ref-for-sample-timelineb$�$">(4)</a> <a href="#ref-for-sample-timelineb$`$">(5)</a> <a href="#ref-for-sample-timelineb$a$">(6)</a> <a href="#ref-for-sample-timelineb$b$">(7)</a> <a href="#ref-for-sample-timelineb$c$">(8)</a> <li><a href="#ref-for-sample-timelineb$d$">18.3.1. Moving the period start point (explicit addressing)</a> <li><a href="#ref-for-sample-timelineb$e$">18.4. Simple addressing</a> <a href="#ref-for-sample-timelineb$f$">(2)</a> <a href="#ref-for-sample-timelineb$g$">(3)</a> <a href="#ref-for-sample-timelineb$h$">(4)</a> <li><a href="#ref-for-sample-timelinec$�$">18.4.1. Inaccuracy in media segment timing when using simple addressing</a> <a href="#ref-for-sample-timelinec$`$">(2)</a> <a href="#ref-for-sample-timelinec$a$">(3)</a> <li><a href="#ref-for-sample-timelinec$b$">18.4.2. Moving the period start point (simple addressing)</a> <a href="#ref-for-sample-timelinec$c$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="timescale-units"> <b><a href="#timescale-units">#timescale-units</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-timescale-units">9.1. Sample timeline</a> <li><a href="#ref-for-timescale-units`$">18.2. Structure of the index segment</a> <a href="#ref-for-timescale-unitsa$">(2)</a> <li><a href="#ref-for-timescale-unitsb$">18.3. Explicit addressing</a> <a href="#ref-for-timescale-unitsc$">(2)</a> <li><a href="#ref-for-timescale-unitsd$">18.4. Simple addressing</a> <a href="#ref-for-timescale-unitse$">(2)</a> <a href="#ref-for-timescale-unitsf$">(3)</a> <li><a href="#ref-for-timescale-unitsg$">19. Large timescales and time values</a> </ul> </aside> <aside class="dfn-panel" data-for="timescale"> <b><a href="#timescale">#timescale</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-timescale">9.1. Sample timeline</a> <li><a href="#ref-for-timescale`$">18.1. Indexed addressing</a> <li><a href="#ref-for-timescalea$">18.3. Explicit addressing</a> <li><a href="#ref-for-timescaleb$">18.4. Simple addressing</a> <li><a href="#ref-for-timescalec$">19. Large timescales and time values</a> </ul> </aside> <aside class="dfn-panel" data-for="unnecessary-segment-reference"> <b><a href="#unnecessary-segment-reference">#unnecessary-segment-reference</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-unnecessary-segment-reference">9.2.3. Removal of unnecessary segment references</a> <a href="#ref-for-unnecessary-segment-reference`$">(2)</a> <a href="#ref-for-unnecessary-segment-referencea$">(3)</a> <li><a href="#ref-for-unnecessary-segment-referenceb$">13.6.3. Removing content from the MPD</a> <li><a href="#ref-for-unnecessary-segment-referencec$">18.3.1. Moving the period start point (explicit addressing)</a> </ul> </aside> <aside class="dfn-panel" data-for="media-segment"> <b><a href="#media-segment">#media-segment</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-media-segment">4.1. Structure of a DASH presentation</a> <li><a href="#ref-for-media-segment`$">6. MPD timeline</a> <a href="#ref-for-media-segmenta$">(2)</a> <a href="#ref-for-media-segmentb$">(3)</a> <a href="#ref-for-media-segmentc$">(4)</a> <li><a href="#ref-for-media-segmentd$">7. Presentation timing characteristics</a> <a href="#ref-for-media-segmente$">(2)</a> <a href="#ref-for-media-segmentf$">(3)</a> <a href="#ref-for-media-segmentg$">(4)</a> <a href="#ref-for-media-segmenth$">(5)</a> <li><a href="#ref-for-media-segment`$�$">9. Representation timing</a> <a href="#ref-for-media-segment`$`$">(2)</a> <li><a href="#ref-for-media-segment`$a$">9.1. Sample timeline</a> <a href="#ref-for-media-segment`$b$">(2)</a> <li><a href="#ref-for-media-segment`$c$">9.2. Referencing media segments</a> <a href="#ref-for-media-segment`$d$">(2)</a> <a href="#ref-for-media-segment`$e$">(3)</a> <a href="#ref-for-media-segment`$f$">(4)</a> <li><a href="#ref-for-media-segment`$g$">9.2.1. Necessary segment references in static presentations</a> <a href="#ref-for-media-segment`$h$">(2)</a> <li><a href="#ref-for-media-segmenta$�$">9.2.2. Necessary segment references in dynamic presentations</a> <a href="#ref-for-media-segmenta$`$">(2)</a> <a href="#ref-for-media-segmenta$a$">(3)</a> <li><a href="#ref-for-media-segmenta$b$">9.3. Alignment of periods and representations</a> <a href="#ref-for-media-segmenta$c$">(2)</a> <a href="#ref-for-media-segmenta$d$">(3)</a> <a href="#ref-for-media-segmenta$e$">(4)</a> <a href="#ref-for-media-segmenta$f$">(5)</a> <li><a href="#ref-for-media-segmenta$g$">11. Media segments</a> <a href="#ref-for-media-segmenta$h$">(2)</a> <a href="#ref-for-media-segmentb$�$">(3)</a> <a href="#ref-for-media-segmentb$`$">(4)</a> <a href="#ref-for-media-segmentb$a$">(5)</a> <a href="#ref-for-media-segmentb$b$">(6)</a> <a href="#ref-for-media-segmentb$c$">(7)</a> <a href="#ref-for-media-segmentb$d$">(8)</a> <a href="#ref-for-media-segmentb$e$">(9)</a> <a href="#ref-for-media-segmentb$f$">(10)</a> <a href="#ref-for-media-segmentb$g$">(11)</a> <li><a href="#ref-for-media-segmentb$h$">12.1. Segment reference duplication during connected period transitions</a> <a href="#ref-for-media-segmentc$�$">(2)</a> <a href="#ref-for-media-segmentc$`$">(3)</a> <a href="#ref-for-media-segmentc$a$">(4)</a> <a href="#ref-for-media-segmentc$b$">(5)</a> <li><a href="#ref-for-media-segmentc$c$">12.2. Period continuity</a> <a href="#ref-for-media-segmentc$d$">(2)</a> <a href="#ref-for-media-segmentc$e$">(3)</a> <a href="#ref-for-media-segmentc$f$">(4)</a> <li><a href="#ref-for-media-segmentc$g$">13. Dynamic presentations</a> <li><a href="#ref-for-media-segmentc$h$">13.3. Availability</a> <a href="#ref-for-media-segmentd$�$">(2)</a> <a href="#ref-for-media-segmentd$`$">(3)</a> <a href="#ref-for-media-segmentd$a$">(4)</a> <a href="#ref-for-media-segmentd$b$">(5)</a> <a href="#ref-for-media-segmentd$c$">(6)</a> <a href="#ref-for-media-segmentd$d$">(7)</a> <a href="#ref-for-media-segmentd$e$">(8)</a> <a href="#ref-for-media-segmentd$f$">(9)</a> <a href="#ref-for-media-segmentd$g$">(10)</a> <a href="#ref-for-media-segmentd$h$">(11)</a> <a href="#ref-for-media-segmente$�$">(12)</a> <a href="#ref-for-media-segmente$`$">(13)</a> <li><a href="#ref-for-media-segmente$a$">13.4. Time shift buffer</a> <a href="#ref-for-media-segmente$b$">(2)</a> <a href="#ref-for-media-segmente$c$">(3)</a> <a href="#ref-for-media-segmente$d$">(4)</a> <a href="#ref-for-media-segmente$e$">(5)</a> <a href="#ref-for-media-segmente$f$">(6)</a> <a href="#ref-for-media-segmente$g$">(7)</a> <a href="#ref-for-media-segmente$h$">(8)</a> <a href="#ref-for-media-segmentf$�$">(9)</a> <li><a href="#ref-for-media-segmentf$`$">13.5. Presentation delay</a> <a href="#ref-for-media-segmentf$a$">(2)</a> <a href="#ref-for-media-segmentf$b$">(3)</a> <a href="#ref-for-media-segmentf$c$">(4)</a> <a href="#ref-for-media-segmentf$d$">(5)</a> <a href="#ref-for-media-segmentf$e$">(6)</a> <a href="#ref-for-media-segmentf$f$">(7)</a> <a href="#ref-for-media-segmentf$g$">(8)</a> <li><a href="#ref-for-media-segmentf$h$">13.6. MPD updates</a> <li><a href="#ref-for-media-segmentg$�$">13.6.1. MPD snapshot validity</a> <a href="#ref-for-media-segmentg$`$">(2)</a> <li><a href="#ref-for-media-segmentg$a$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-media-segmentg$b$">(2)</a> <li><a href="#ref-for-media-segmentg$c$">13.6.4. End of live content</a> <li><a href="#ref-for-media-segmentg$d$">13.7. MPD refreshes</a> <a href="#ref-for-media-segmentg$e$">(2)</a> <li><a href="#ref-for-media-segmentg$f$">14. Segment loss handling</a> <a href="#ref-for-media-segmentg$g$">(2)</a> <a href="#ref-for-media-segmentg$h$">(3)</a> <a href="#ref-for-media-segmenth$�$">(4)</a> <a href="#ref-for-media-segmenth$`$">(5)</a> <a href="#ref-for-media-segmenth$a$">(6)</a> <li><a href="#ref-for-media-segmenth$b$">16. Forbidden techniques</a> <li><a href="#ref-for-media-segmenth$c$">17.2. Split a period</a> <a href="#ref-for-media-segmenth$d$">(2)</a> <a href="#ref-for-media-segmenth$e$">(3)</a> <a href="#ref-for-media-segmenth$f$">(4)</a> <a href="#ref-for-media-segmenth$g$">(5)</a> <li><a href="#ref-for-media-segmenth$h$">18. Segment addressing modes</a> <a href="#ref-for-media-segment`$�$�$">(2)</a> <li><a href="#ref-for-media-segment`$�$`$">18.1. Indexed addressing</a> <a href="#ref-for-media-segment`$�$a$">(2)</a> <a href="#ref-for-media-segment`$�$b$">(3)</a> <a href="#ref-for-media-segment`$�$c$">(4)</a> <a href="#ref-for-media-segment`$�$d$">(5)</a> <li><a href="#ref-for-media-segment`$�$e$">18.2. Structure of the index segment</a> <a href="#ref-for-media-segment`$�$f$">(2)</a> <a href="#ref-for-media-segment`$�$g$">(3)</a> <a href="#ref-for-media-segment`$�$h$">(4)</a> <a href="#ref-for-media-segment`$`$�$">(5)</a> <a href="#ref-for-media-segment`$`$`$">(6)</a> <a href="#ref-for-media-segment`$`$a$">(7)</a> <a href="#ref-for-media-segment`$`$b$">(8)</a> <a href="#ref-for-media-segment`$`$c$">(9)</a> <li><a href="#ref-for-media-segment`$`$d$">18.3. Explicit addressing</a> <a href="#ref-for-media-segment`$`$e$">(2)</a> <a href="#ref-for-media-segment`$`$f$">(3)</a> <a href="#ref-for-media-segment`$`$g$">(4)</a> <a href="#ref-for-media-segment`$`$h$">(5)</a> <a href="#ref-for-media-segment`$a$�$">(6)</a> <a href="#ref-for-media-segment`$a$`$">(7)</a> <a href="#ref-for-media-segment`$a$a$">(8)</a> <a href="#ref-for-media-segment`$a$b$">(9)</a> <a href="#ref-for-media-segment`$a$c$">(10)</a> <a href="#ref-for-media-segment`$a$d$">(11)</a> <a href="#ref-for-media-segment`$a$e$">(12)</a> <a href="#ref-for-media-segment`$a$f$">(13)</a> <a href="#ref-for-media-segment`$a$g$">(14)</a> <a href="#ref-for-media-segment`$a$h$">(15)</a> <a href="#ref-for-media-segment`$b$�$">(16)</a> <a href="#ref-for-media-segment`$b$`$">(17)</a> <a href="#ref-for-media-segment`$b$a$">(18)</a> <a href="#ref-for-media-segment`$b$b$">(19)</a> <a href="#ref-for-media-segment`$b$c$">(20)</a> <li><a href="#ref-for-media-segment`$b$d$">18.3.1. Moving the period start point (explicit addressing)</a> <li><a href="#ref-for-media-segment`$b$e$">18.4. Simple addressing</a> <a href="#ref-for-media-segment`$b$f$">(2)</a> <a href="#ref-for-media-segment`$b$g$">(3)</a> <a href="#ref-for-media-segment`$b$h$">(4)</a> <a href="#ref-for-media-segment`$c$�$">(5)</a> <a href="#ref-for-media-segment`$c$`$">(6)</a> <a href="#ref-for-media-segment`$c$a$">(7)</a> <a href="#ref-for-media-segment`$c$b$">(8)</a> <a href="#ref-for-media-segment`$c$c$">(9)</a> <a href="#ref-for-media-segment`$c$d$">(10)</a> <a href="#ref-for-media-segment`$c$e$">(11)</a> <a href="#ref-for-media-segment`$c$f$">(12)</a> <a href="#ref-for-media-segment`$c$g$">(13)</a> <a href="#ref-for-media-segment`$c$h$">(14)</a> <a href="#ref-for-media-segment`$d$�$">(15)</a> <a href="#ref-for-media-segment`$d$`$">(16)</a> <a href="#ref-for-media-segment`$d$a$">(17)</a> <a href="#ref-for-media-segment`$d$b$">(18)</a> <a href="#ref-for-media-segment`$d$c$">(19)</a> <a href="#ref-for-media-segment`$d$d$">(20)</a> <a href="#ref-for-media-segment`$d$e$">(21)</a> <a href="#ref-for-media-segment`$d$f$">(22)</a> <a href="#ref-for-media-segment`$d$g$">(23)</a> <li><a href="#ref-for-media-segment`$d$h$">18.4.1. Inaccuracy in media segment timing when using simple addressing</a> <a href="#ref-for-media-segment`$e$�$">(2)</a> <a href="#ref-for-media-segment`$e$`$">(3)</a> <a href="#ref-for-media-segment`$e$a$">(4)</a> <a href="#ref-for-media-segment`$e$b$">(5)</a> <a href="#ref-for-media-segment`$e$c$">(6)</a> <a href="#ref-for-media-segment`$e$d$">(7)</a> <a href="#ref-for-media-segment`$e$e$">(8)</a> <a href="#ref-for-media-segment`$e$f$">(9)</a> <a href="#ref-for-media-segment`$e$g$">(10)</a> <a href="#ref-for-media-segment`$e$h$">(11)</a> <a href="#ref-for-media-segment`$f$�$">(12)</a> <a href="#ref-for-media-segment`$f$`$">(13)</a> <a href="#ref-for-media-segment`$f$a$">(14)</a> <li><a href="#ref-for-media-segment`$f$b$">18.4.2. Moving the period start point (simple addressing)</a> <a href="#ref-for-media-segment`$f$c$">(2)</a> <a href="#ref-for-media-segment`$f$d$">(3)</a> <a href="#ref-for-media-segment`$f$e$">(4)</a> <a href="#ref-for-media-segment`$f$f$">(5)</a> <a href="#ref-for-media-segment`$f$g$">(6)</a> <a href="#ref-for-media-segment`$f$h$">(7)</a> <a href="#ref-for-media-segment`$g$�$">(8)</a> <li><a href="#ref-for-media-segment`$g$`$">18.4.3. Converting simple addressing to explicit addressing</a> <a href="#ref-for-media-segment`$g$a$">(2)</a> <a href="#ref-for-media-segment`$g$b$">(3)</a> <a href="#ref-for-media-segment`$g$c$">(4)</a> </ul> </aside> <aside class="dfn-panel" data-for="segment-start-point"> <b><a href="#segment-start-point">#segment-start-point</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-segment-start-point">9.3. Alignment of periods and representations</a> <li><a href="#ref-for-segment-start-point`$">11. Media segments</a> <a href="#ref-for-segment-start-pointa$">(2)</a> <a href="#ref-for-segment-start-pointb$">(3)</a> <li><a href="#ref-for-segment-start-pointc$">13.6.3. Removing content from the MPD</a> <li><a href="#ref-for-segment-start-pointd$">18.3. Explicit addressing</a> <a href="#ref-for-segment-start-pointe$">(2)</a> <a href="#ref-for-segment-start-pointf$">(3)</a> <a href="#ref-for-segment-start-pointg$">(4)</a> <li><a href="#ref-for-segment-start-pointh$">18.4. Simple addressing</a> <a href="#ref-for-segment-start-point`$�$">(2)</a> <a href="#ref-for-segment-start-point`$`$">(3)</a> <a href="#ref-for-segment-start-point`$a$">(4)</a> <li><a href="#ref-for-segment-start-point`$b$">18.4.2. Moving the period start point (simple addressing)</a> <a href="#ref-for-segment-start-point`$c$">(2)</a> <a href="#ref-for-segment-start-point`$d$">(3)</a> <a href="#ref-for-segment-start-point`$e$">(4)</a> <li><a href="#ref-for-segment-start-point`$f$">18.4.3. Converting simple addressing to explicit addressing</a> <a href="#ref-for-segment-start-point`$g$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="segment-end-point"> <b><a href="#segment-end-point">#segment-end-point</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-segment-end-point">9.3. Alignment of periods and representations</a> <li><a href="#ref-for-segment-end-point`$">13.3. Availability</a> <a href="#ref-for-segment-end-pointa$">(2)</a> <li><a href="#ref-for-segment-end-pointb$">13.6.3. Removing content from the MPD</a> </ul> </aside> <aside class="dfn-panel" data-for="period-connected"> <b><a href="#period-connected">#period-connected</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-period-connected">12. Period connectivity</a> <a href="#ref-for-period-connected`$">(2)</a> <a href="#ref-for-period-connecteda$">(3)</a> <a href="#ref-for-period-connectedb$">(4)</a> <a href="#ref-for-period-connectedc$">(5)</a> <a href="#ref-for-period-connectedd$">(6)</a> <a href="#ref-for-period-connectede$">(7)</a> <a href="#ref-for-period-connectedf$">(8)</a> <a href="#ref-for-period-connectedg$">(9)</a> <a href="#ref-for-period-connectedh$">(10)</a> <a href="#ref-for-period-connected`$�$">(11)</a> <li><a href="#ref-for-period-connected`$`$">12.1. Segment reference duplication during connected period transitions</a> <a href="#ref-for-period-connected`$a$">(2)</a> <a href="#ref-for-period-connected`$b$">(3)</a> <a href="#ref-for-period-connected`$c$">(4)</a> <li><a href="#ref-for-period-connected`$d$">17.2. Split a period</a> <a href="#ref-for-period-connected`$e$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="wall-clock"> <b><a href="#wall-clock">#wall-clock</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-wall-clock">7. Presentation timing characteristics</a> <a href="#ref-for-wall-clock`$">(2)</a> <a href="#ref-for-wall-clocka$">(3)</a> <li><a href="#ref-for-wall-clockb$">10. Clock drift is forbidden</a> <a href="#ref-for-wall-clockc$">(2)</a> <a href="#ref-for-wall-clockd$">(3)</a> <a href="#ref-for-wall-clocke$">(4)</a> <a href="#ref-for-wall-clockf$">(5)</a> <li><a href="#ref-for-wall-clockg$">13. Dynamic presentations</a> <li><a href="#ref-for-wall-clockh$">13.1. Clock synchronization</a> <a href="#ref-for-wall-clock`$�$">(2)</a> <a href="#ref-for-wall-clock`$`$">(3)</a> <li><a href="#ref-for-wall-clock`$a$">13.3. Availability</a> <a href="#ref-for-wall-clock`$b$">(2)</a> <li><a href="#ref-for-wall-clock`$c$">13.4. Time shift buffer</a> <a href="#ref-for-wall-clock`$d$">(2)</a> <li><a href="#ref-for-wall-clock`$e$">13.6.1. MPD snapshot validity</a> </ul> </aside> <aside class="dfn-panel" data-for="available"> <b><a href="#available">#available</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-available">6. MPD timeline</a> <li><a href="#ref-for-available`$">7. Presentation timing characteristics</a> <a href="#ref-for-availablea$">(2)</a> <a href="#ref-for-availableb$">(3)</a> <li><a href="#ref-for-availablec$">9.2.2. Necessary segment references in dynamic presentations</a> <li><a href="#ref-for-availabled$">13. Dynamic presentations</a> <a href="#ref-for-availablee$">(2)</a> <a href="#ref-for-availablef$">(3)</a> <li><a href="#ref-for-availableg$">13.3. Availability</a> <a href="#ref-for-availableh$">(2)</a> <a href="#ref-for-available`$�$">(3)</a> <a href="#ref-for-available`$`$">(4)</a> <a href="#ref-for-available`$a$">(5)</a> <a href="#ref-for-available`$b$">(6)</a> <a href="#ref-for-available`$c$">(7)</a> <a href="#ref-for-available`$d$">(8)</a> <a href="#ref-for-available`$e$">(9)</a> <a href="#ref-for-available`$f$">(10)</a> <a href="#ref-for-available`$g$">(11)</a> <a href="#ref-for-available`$h$">(12)</a> <a href="#ref-for-availablea$�$">(13)</a> <a href="#ref-for-availablea$`$">(14)</a> <li><a href="#ref-for-availablea$a$">13.4. Time shift buffer</a> <li><a href="#ref-for-availablea$b$">13.5. Presentation delay</a> <a href="#ref-for-availablea$c$">(2)</a> <a href="#ref-for-availablea$d$">(3)</a> <a href="#ref-for-availablea$e$">(4)</a> <li><a href="#ref-for-availablea$f$">13.6.1. MPD snapshot validity</a> <li><a href="#ref-for-availablea$g$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-availablea$h$">(2)</a> <a href="#ref-for-availableb$�$">(3)</a> <li><a href="#ref-for-availableb$`$">13.7. MPD refreshes</a> <a href="#ref-for-availableb$a$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="availability-window"> <b><a href="#availability-window">#availability-window</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-availability-window">13.3. Availability</a> <a href="#ref-for-availability-window`$">(2)</a> <a href="#ref-for-availability-windowa$">(3)</a> <a href="#ref-for-availability-windowb$">(4)</a> <a href="#ref-for-availability-windowc$">(5)</a> <a href="#ref-for-availability-windowd$">(6)</a> <a href="#ref-for-availability-windowe$">(7)</a> <a href="#ref-for-availability-windowf$">(8)</a> <li><a href="#ref-for-availability-windowg$">13.5. Presentation delay</a> <li><a href="#ref-for-availability-windowh$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-availability-window`$�$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="time-shift-buffer"> <b><a href="#time-shift-buffer">#time-shift-buffer</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-time-shift-buffer">9.2.2. Necessary segment references in dynamic presentations</a> <a href="#ref-for-time-shift-buffer`$">(2)</a> <a href="#ref-for-time-shift-buffera$">(3)</a> <a href="#ref-for-time-shift-bufferb$">(4)</a> <li><a href="#ref-for-time-shift-bufferc$">13.4. Time shift buffer</a> <a href="#ref-for-time-shift-bufferd$">(2)</a> <a href="#ref-for-time-shift-buffere$">(3)</a> <a href="#ref-for-time-shift-bufferf$">(4)</a> <a href="#ref-for-time-shift-bufferg$">(5)</a> <a href="#ref-for-time-shift-bufferh$">(6)</a> <a href="#ref-for-time-shift-buffer`$�$">(7)</a> <a href="#ref-for-time-shift-buffer`$`$">(8)</a> <a href="#ref-for-time-shift-buffer`$a$">(9)</a> <a href="#ref-for-time-shift-buffer`$b$">(10)</a> <a href="#ref-for-time-shift-buffer`$c$">(11)</a> <a href="#ref-for-time-shift-buffer`$d$">(12)</a> <a href="#ref-for-time-shift-buffer`$e$">(13)</a> <li><a href="#ref-for-time-shift-buffer`$f$">13.5. Presentation delay</a> <a href="#ref-for-time-shift-buffer`$g$">(2)</a> <a href="#ref-for-time-shift-buffer`$h$">(3)</a> <a href="#ref-for-time-shift-buffera$�$">(4)</a> <a href="#ref-for-time-shift-buffera$`$">(5)</a> <li><a href="#ref-for-time-shift-buffera$a$">13.6. MPD updates</a> <li><a href="#ref-for-time-shift-buffera$b$">13.6.3. Removing content from the MPD</a> <a href="#ref-for-time-shift-buffera$c$">(2)</a> <li><a href="#ref-for-time-shift-buffera$d$">13.6.4. End of live content</a> </ul> </aside> <aside class="dfn-panel" data-for="time-shift"> <b><a href="#time-shift">#time-shift</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-time-shift">7. Presentation timing characteristics</a> <li><a href="#ref-for-time-shift`$">9.3. Alignment of periods and representations</a> <li><a href="#ref-for-time-shifta$">12.1. Segment reference duplication during connected period transitions</a> <a href="#ref-for-time-shiftb$">(2)</a> <li><a href="#ref-for-time-shiftc$">13. Dynamic presentations</a> <a href="#ref-for-time-shiftd$">(2)</a> <li><a href="#ref-for-time-shifte$">13.4. Time shift buffer</a> <a href="#ref-for-time-shiftf$">(2)</a> <a href="#ref-for-time-shiftg$">(3)</a> <a href="#ref-for-time-shifth$">(4)</a> <li><a href="#ref-for-time-shift`$�$">13.6.3. Removing content from the MPD</a> </ul> </aside> <aside class="dfn-panel" data-for="presentation-delay"> <b><a href="#presentation-delay">#presentation-delay</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-presentation-delay">13.5. Presentation delay</a> <a href="#ref-for-presentation-delay`$">(2)</a> <a href="#ref-for-presentation-delaya$">(3)</a> <a href="#ref-for-presentation-delayb$">(4)</a> <a href="#ref-for-presentation-delayc$">(5)</a> <a href="#ref-for-presentation-delayd$">(6)</a> </ul> </aside> <aside class="dfn-panel" data-for="effective-time-shift-buffer"> <b><a href="#effective-time-shift-buffer">#effective-time-shift-buffer</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-effective-time-shift-buffer">13.5. Presentation delay</a> <a href="#ref-for-effective-time-shift-buffer`$">(2)</a> <a href="#ref-for-effective-time-shift-buffera$">(3)</a> <a href="#ref-for-effective-time-shift-bufferb$">(4)</a> <a href="#ref-for-effective-time-shift-bufferc$">(5)</a> </ul> </aside> <aside class="dfn-panel" data-for="mpd-validity-duration"> <b><a href="#mpd-validity-duration">#mpd-validity-duration</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-mpd-validity-duration">8.2. First and last period timing in dynamic presentations</a> <li><a href="#ref-for-mpd-validity-duration`$">9.2.2. Necessary segment references in dynamic presentations</a> <a href="#ref-for-mpd-validity-durationa$">(2)</a> <a href="#ref-for-mpd-validity-durationb$">(3)</a> <a href="#ref-for-mpd-validity-durationc$">(4)</a> <a href="#ref-for-mpd-validity-durationd$">(5)</a> <li><a href="#ref-for-mpd-validity-duratione$">13. Dynamic presentations</a> <li><a href="#ref-for-mpd-validity-durationf$">13.6. MPD updates</a> <li><a href="#ref-for-mpd-validity-durationg$">13.6.1. MPD snapshot validity</a> <a href="#ref-for-mpd-validity-durationh$">(2)</a> <a href="#ref-for-mpd-validity-duration`$�$">(3)</a> <li><a href="#ref-for-mpd-validity-duration`$`$">13.6.1.1. In-band MPD validity events</a> <li><a href="#ref-for-mpd-validity-duration`$a$">13.6.3. Removing content from the MPD</a> <li><a href="#ref-for-mpd-validity-duration`$b$">13.7. MPD refreshes</a> <a href="#ref-for-mpd-validity-duration`$c$">(2)</a> <a href="#ref-for-mpd-validity-duration`$d$">(3)</a> <a href="#ref-for-mpd-validity-duration`$e$">(4)</a> <a href="#ref-for-mpd-validity-duration`$f$">(5)</a> <li><a href="#ref-for-mpd-validity-duration`$g$">13.7.1. Conditional MPD downloads</a> </ul> </aside> <aside class="dfn-panel" data-for="mpd-refreshes"> <b><a href="#mpd-refreshes">#mpd-refreshes</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-mpd-refreshes">13.2. Leap seconds</a> <li><a href="#ref-for-mpd-refreshes`$">13.7.1. Conditional MPD downloads</a> <a href="#ref-for-mpd-refreshesa$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="addressing-modes"> <b><a href="#addressing-modes">#addressing-modes</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-addressing-modes">4.1. Structure of a DASH presentation</a> <li><a href="#ref-for-addressing-modes`$">4.3. Terminology choices in this document</a> <li><a href="#ref-for-addressing-modesa$">9.1. Sample timeline</a> <a href="#ref-for-addressing-modesb$">(2)</a> <a href="#ref-for-addressing-modesc$">(3)</a> <li><a href="#ref-for-addressing-modesd$">9.2. Referencing media segments</a> <a href="#ref-for-addressing-modese$">(2)</a> <li><a href="#ref-for-addressing-modesf$">11. Media segments</a> <li><a href="#ref-for-addressing-modesg$">18. Segment addressing modes</a> <a href="#ref-for-addressing-modesh$">(2)</a> <a href="#ref-for-addressing-modes`$�$">(3)</a> <a href="#ref-for-addressing-modes`$`$">(4)</a> <a href="#ref-for-addressing-modes`$a$">(5)</a> </ul> </aside> <aside class="dfn-panel" data-for="indexed-addressing"> <b><a href="#indexed-addressing">#indexed-addressing</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-indexed-addressing">9.2.3. Removal of unnecessary segment references</a> <a href="#ref-for-indexed-addressing`$">(2)</a> <li><a href="#ref-for-indexed-addressinga$">17.2. Split a period</a> <li><a href="#ref-for-indexed-addressingb$">18. Segment addressing modes</a> <a href="#ref-for-indexed-addressingc$">(2)</a> <li><a href="#ref-for-indexed-addressingd$">18.1. Indexed addressing</a> <a href="#ref-for-indexed-addressinge$">(2)</a> <a href="#ref-for-indexed-addressingf$">(3)</a> <li><a href="#ref-for-indexed-addressingg$">18.2.1. Moving the period start point (indexed addressing)</a> </ul> </aside> <aside class="dfn-panel" data-for="explicit-addressing"> <b><a href="#explicit-addressing">#explicit-addressing</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-explicit-addressing">13.6.2. Adding content to the MPD</a> <li><a href="#ref-for-explicit-addressing`$">18. Segment addressing modes</a> <a href="#ref-for-explicit-addressinga$">(2)</a> <li><a href="#ref-for-explicit-addressingb$">18.3. Explicit addressing</a> <a href="#ref-for-explicit-addressingc$">(2)</a> <a href="#ref-for-explicit-addressingd$">(3)</a> <a href="#ref-for-explicit-addressinge$">(4)</a> <li><a href="#ref-for-explicit-addressingf$">18.3.1. Moving the period start point (explicit addressing)</a> <li><a href="#ref-for-explicit-addressingg$">18.4. Simple addressing</a> <li><a href="#ref-for-explicit-addressingh$">18.4.2. Moving the period start point (simple addressing)</a> <li><a href="#ref-for-explicit-addressing`$�$">18.4.3. Converting simple addressing to explicit addressing</a> <a href="#ref-for-explicit-addressing`$`$">(2)</a> <a href="#ref-for-explicit-addressing`$a$">(3)</a> <a href="#ref-for-explicit-addressing`$b$">(4)</a> </ul> </aside> <aside class="dfn-panel" data-for="simple-addressing"> <b><a href="#simple-addressing">#simple-addressing</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-simple-addressing">11. Media segments</a> <a href="#ref-for-simple-addressing`$">(2)</a> <a href="#ref-for-simple-addressinga$">(3)</a> <li><a href="#ref-for-simple-addressingb$">13.6.2. Adding content to the MPD</a> <li><a href="#ref-for-simple-addressingc$">17.2. Split a period</a> <li><a href="#ref-for-simple-addressingd$">18. Segment addressing modes</a> <li><a href="#ref-for-simple-addressinge$">18.4. Simple addressing</a> <a href="#ref-for-simple-addressingf$">(2)</a> <a href="#ref-for-simple-addressingg$">(3)</a> <a href="#ref-for-simple-addressingh$">(4)</a> <a href="#ref-for-simple-addressing`$�$">(5)</a> <li><a href="#ref-for-simple-addressing`$`$">18.4.1. Inaccuracy in media segment timing when using simple addressing</a> <a href="#ref-for-simple-addressing`$a$">(2)</a> <li><a href="#ref-for-simple-addressing`$b$">18.4.2. Moving the period start point (simple addressing)</a> <a href="#ref-for-simple-addressing`$c$">(2)</a> <a href="#ref-for-simple-addressing`$d$">(3)</a> <a href="#ref-for-simple-addressing`$e$">(4)</a> <li><a href="#ref-for-simple-addressing`$f$">18.4.3. Converting simple addressing to explicit addressing</a> <a href="#ref-for-simple-addressing`$g$">(2)</a> <a href="#ref-for-simple-addressing`$h$">(3)</a> <a href="#ref-for-simple-addressinga$�$">(4)</a> </ul> </aside> <script>/* script-dfn-panel */ document.body.addEventListener("click", function(e) { var queryAll = function(sel) { return [].slice.call(document.querySelectorAll(sel)); } // Find the dfn element or panel, if any, that was clicked on. var el = e.target; var target; var hitALink = false; while(el.parentElement) { if(el.tagName == "A") { // Clicking on a link in a <dfn> shouldn't summon the panel hitALink = true; } if(el.classList.contains("dfn-paneled")) { target = "dfn"; break; } if(el.classList.contains("dfn-panel")) { target = "dfn-panel"; break; } el = el.parentElement; } if(target != "dfn-panel") { // Turn off any currently "on" or "activated" panels. queryAll(".dfn-panel.on, .dfn-panel.activated").forEach(function(el){ el.classList.remove("on"); el.classList.remove("activated"); }); } if(target == "dfn" && !hitALink) { // open the panel var dfnPanel = document.querySelector(".dfn-panel[data-for='" + el.id + "']"); if(dfnPanel) { dfnPanel.classList.add("on"); var rect = el.getBoundingClientRect(); dfnPanel.style.left = window.scrollX + rect.right + 5 + "px"; dfnPanel.style.top = window.scrollY + rect.top + "px"; var panelRect = dfnPanel.getBoundingClientRect(); var panelWidth = panelRect.right - panelRect.left; if(panelRect.right > document.body.scrollWidth && (rect.left - (panelWidth + 5)) > 0) { // Reposition, because the panel is overflowing dfnPanel.style.left = window.scrollX + rect.left - (panelWidth + 5) + "px"; } } else { console.log("Couldn't find .dfn-panel[data-for='" + el.id + "']"); } } else if(target == "dfn-panel") { // Switch it to "activated" state, which pins it. el.classList.add("activated"); el.style.left = null; el.style.top = null; } }); </script>