Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
ee0219b
Added new version to streaming cmcd settings
sannti97 Aug 15, 2024
b7093f0
Added reporting settings and improved _onRequestEnd
sannti97 Aug 17, 2024
d8a4e09
Added handlers to _updateRequestUrlAndHeadersWithCMCD
sannti97 Aug 17, 2024
f905c98
Changed reporting mode to a list
sannti97 Aug 17, 2024
75d7b36
WIP: Making each mode configurable and removed cmcd version
sannti97 Aug 19, 2024
cadfc04
Added mode into each reporting mode
sannti97 Aug 20, 2024
f498e8a
Reverted change in main.js
sannti97 Aug 20, 2024
0d6e103
Removed warning log
sannti97 Aug 20, 2024
f30f2bb
Added version to config and fixed handleCmcdDataGeneratedEvent
sannti97 Aug 21, 2024
86c40c9
Reverted changes in handleCmcdDataGeneratedEvent
sannti97 Aug 21, 2024
33e9983
Improved _updateRequestUrlAndHeadersWithCMCD code
sannti97 Aug 21, 2024
dd4ab14
Added mandatory keys for responseMode
sannti97 Aug 23, 2024
01bfb0c
Added observation about ts key
sannti97 Aug 23, 2024
8643aa7
Remove cmcd params from url key
sannti97 Aug 23, 2024
1371edf
Explained cmcd example config
sannti97 Aug 23, 2024
bd8d0c3
Fix bug when desabling cmcdResponseMode
sannti97 Aug 24, 2024
73545fb
Init commit for adding state-interval mode
sannti97 Aug 24, 2024
aa35d52
Revert "Init commit for adding state-interval mode"
sannti97 Aug 26, 2024
bfab35f
Send cmcd data after player state change
sannti97 Aug 26, 2024
42b1d4f
Send cmcd data every x seconds
sannti97 Aug 26, 2024
17a2eaf
Merge pull request #16 from qualabs/cmcd-v2-demuxed/response-mode
sannti97 Aug 27, 2024
8c70f9d
Removed sta key when reporting after interval
sannti97 Aug 27, 2024
2bb2f31
Remove unsopported mode 3 keys
sannti97 Aug 28, 2024
b36f347
Added comments to state interval conf
sannti97 Aug 28, 2024
f1d7686
Removed requestHeaders optional config
sannti97 Aug 28, 2024
83d6616
Added more playback events
sannti97 Aug 28, 2024
f3dfbaf
Improved version handling in cmcdModel
sannti97 Aug 28, 2024
81502a2
Added cid to cmcd keys state itnerval
sannti97 Aug 28, 2024
d08d600
Fixed comment in state config
sannti97 Aug 28, 2024
22d5557
Removed _getStateIntervalCmcdData
sannti97 Aug 29, 2024
5bd1914
Added ltc msd and ts keys
sannti97 Aug 29, 2024
c7fcb25
Fixed state names
sannti97 Aug 29, 2024
ae19c83
fixed seeking state and improved state handling
sannti97 Aug 30, 2024
046a1c1
Refactored _updateRequestUrlAndHeadersWithCMCD
sannti97 Aug 30, 2024
7ea4f00
Merge branch 'cmcd-v2-demuxed/state-interval-mode' into feature/cmcd-…
nicolaslevy Aug 30, 2024
8582c17
fix: msd, add keys in cmcd.html example
nicolaslevy Aug 30, 2024
488abf3
added ttfb, ttlb and rc keys
nicolaslevy Aug 30, 2024
9e78810
fixed query mode
nicolaslevy Sep 10, 2024
4a78492
example fixed
nicolaslevy Sep 10, 2024
6cd75b9
fix: send msd once per CMCD mode
nicolaslevy Sep 26, 2024
a3bf91f
fix send msd only one time per mode
nicolaslevy Sep 26, 2024
681ba1a
fix date
nicolaslevy Sep 26, 2024
03bc302
Alternative palyer POC
sebastianpiq Nov 5, 2024
0c9aed2
try to keep buffers on alternative change
JoaquinBCh Nov 6, 2024
5f340c1
restore bytes to original mediasource
N1Knight Nov 12, 2024
a79b80a
POC manifes mpd lists
sebastianpiq Nov 29, 2024
2a1d963
POC manifes mpd lists
sebastianpiq Nov 29, 2024
428b63e
Implement POC of MPD Lists
sebastianpiq Dec 2, 2024
b7b4827
AlternativeMpd: Two video tag approach
mhargain Dec 5, 2024
6c179cf
Implement validation for link periods
jmt-qualabs Dec 5, 2024
fec3f83
Fix mpd list validation
jmt-qualabs Dec 5, 2024
7f963a2
Implement mpd list controller
sebastianpiq Dec 10, 2024
9e9b157
Implement merging of linked periods
jmt-qualabs Dec 10, 2024
76c5665
Merge earliestResolutionTimeOffset
jmt-qualabs Dec 11, 2024
0a6d1d0
Only update manifest inside controller if list mpd
jmt-qualabs Dec 11, 2024
75c6f94
@AlternativeMpd: modes, returnOffset and mixin added
mhargain Dec 18, 2024
0d56009
@AlternativeMpd: added manifest highlight for demo page
mhargain Dec 19, 2024
e351315
Fix url resolution in imported mpd
jmt-qualabs Dec 19, 2024
3c656bb
Fix list mpd with a regular period as first period
jmt-qualabs Dec 23, 2024
126a6b6
Fix trying to prebuffer a linked period not yet resolved
jmt-qualabs Dec 27, 2024
bba9de5
updated demo url
mhargain Dec 30, 2024
85808ee
Revert "restore bytes to original mediasource"
mhargain Dec 30, 2024
1c0de11
Implement seek to linked periods
jmt-qualabs Jan 2, 2025
ee3494a
Add semicolons
jmt-qualabs Jan 3, 2025
84b80e3
Merge pull request #32 from qualabs/mpd-lists/regular-initial-period
jmt-qualabs Jan 3, 2025
c1af5a7
Merge pull request #33 from qualabs/mpd-lists/zero-earliest-resolutio…
jmt-qualabs Jan 3, 2025
0012008
Merge pull request #35 from qualabs/mpd-lists/linked-period-seek
jmt-qualabs Jan 3, 2025
2695d13
Move first period start time check to the regular period getter
sebastianpiq Jan 3, 2025
93899cd
Deduplicate load logic
jmt-qualabs Jan 3, 2025
f25126f
Merge pull request #36 from qualabs/mpd-lists/first-period-start-time…
jmt-qualabs Jan 6, 2025
c55133f
Address pr comments
jmt-qualabs Jan 6, 2025
4935505
Merge pull request #37 from qualabs/mpd-lists/manifest-load-refactor
sebastianpiq Jan 6, 2025
5a52f54
Resolve imported mpd url using list mpd BaseURL
jmt-qualabs Jan 7, 2025
61d85e2
Fix NaN duration if no importedMpd duration
jmt-qualabs Jan 7, 2025
ac469ba
Compute list mpd duration on manifest load
jmt-qualabs Jan 8, 2025
e127715
Move start check logic to controller and set default
jmt-qualabs Jan 8, 2025
9e2b547
Simplify start checking expression
jmt-qualabs Jan 9, 2025
4050e48
Merge pull request #38 from qualabs/mpd-lists/imported-mpd-url
jmt-qualabs Jan 9, 2025
4e32b44
Merge pull request #39 from qualabs/mpd-lists/imported-period-duration
jmt-qualabs Jan 9, 2025
38d7066
Merge pull request #40 from qualabs/mpd-lists/default-start-linked-pe…
jmt-qualabs Jan 9, 2025
330158b
Resolve bug of the list mpd with the earliest resolution time offset …
sebastianpiq Jan 10, 2025
268bba9
merge done
nicolaslevy Jan 14, 2025
36015d9
fix baseURL stuff, alternative mpd is working with listmpd but just f…
nicolaslevy Jan 14, 2025
11683e9
merge poc/sgai and feature/cmcd-v2-demuxed
nicolaslevy Jan 15, 2025
1b7db52
fix typo in utils function name
nicolaslevy Jan 15, 2025
df50efc
example working with alternativeMPD, ListMPD and CMCD v2
nicolaslevy Jan 15, 2025
8af0297
added sample
nicolaslevy Jan 15, 2025
c30b8e6
trigger events when alt content start and ends. Add id to event mappi…
nicolaslevy Jan 16, 2025
2d870c2
no comment
nicolaslevy Jan 16, 2025
c3b81a1
CMCD: added event key, added error key
nicolaslevy Jan 16, 2025
8eb3c7f
copy cmcd config from main player to alt Player and add a Hack to dis…
nicolaslevy Jan 20, 2025
3b68b0f
CMCD: rename state-interval mode to event mode
nicolaslevy Jan 20, 2025
cacbfd9
fix int key and add bg key
nicolaslevy Jan 28, 2025
f53c77f
fix event listeners in cmcd
nicolaslevy Jan 28, 2025
36ca0ea
fix available cmcd keys
nicolaslevy Jan 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build/webpack.dev.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const umdDevConfig = merge(umdConfig, {
open: ['samples/index.html'],
hot: true,
compress: true,
port: 3000
port: 3001
}
});

Expand Down
17 changes: 17 additions & 0 deletions docs/cmcd-v2/reporting-modes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Reporting modes

Here are notes about the challenge of implementing the new reporting modes of CMCD-v2.

### Response Mode

- Modified the `_updateRequestUrlAndHeadersWithCMCD` function to save the cmcdHeaders or `cmcdParams` in `customData` so they can be sent to the remote server in the `_onRequestEnd` function.

- Observations:
- The mode that already exists in the configuration for the "transmition mode" might be confusing with the new mode for the "reporting mode".

- The ‘ts’ key is not entirely accurate since the CMCD parameters are generated before the request starts.


### Event Mode

- Should the state be set to rebuffering when the video buffer gets stalled? or also the audio buffer?
198 changes: 198 additions & 0 deletions samples/advanced/cmcd-alternative-ads.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Live + AlternativeMPD + ListMPD + CMCD v2</title>

<script src="../../dist/dash.all.debug.js"></script>

<!-- Bootstrap core CSS -->
<link href="../lib/bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="../lib/main.css" rel="stylesheet">

<style>
video {
width: 640px;
height: 360px;
}

#trace {
height: 500px;
margin-top: 20px;
font-size: 10px;
}
</style>

<script class="code">
var CMCD_DATA_GENERATED = dashjs.MetricsReporting.events.CMCD_DATA_GENERATED;

/* possible modes of attach cmcd data */
var CMCD_MODE_QUERY = 'query'; /* as query parameters */
var CMCD_MODE_HEADER = 'header'; /* as HTTP headers */
var player;

function init() {
var video,
url = 'mpds/live-alternative-ads.mpd',
version;

player = dashjs.MediaPlayer().create();
video = document.querySelector('video');
player.initialize();
version = player.getVersion();

player.on(CMCD_DATA_GENERATED, handleCmcdDataGeneratedEvent);

player.updateSettings({
streaming: {
cmcd: {
enabled: true, /* global enable reporting of cmcd parameters */
version: 2, /* 1 is the default version */
reporting: {
requestMode: {
enabled: true, /* enable cmcdv2 request mode */
mode: CMCD_MODE_QUERY, /* overrides global mode */
},
responseMode: {
enabled: true, /* enable cmcdv2 response mode. FALSE by default */
mode: CMCD_MODE_QUERY, /* overrides global mode. JSON not supported */
enabledKeys: ['bg', 'int', 'sid', 'cid', 'ts', 'url', 'br', 'd', 'ot', 'tb', 'v', 'sta', 'ttfb', 'ttlb','rc'], /* optional, overrides global keys */
requestUrl: 'http://' + window.location.hostname + ':3000/cmcd/response-mode', /*mandatory, URL to send report */
requestMethod: 'POST', /*optional, get by default */
},
eventMode: {
enabled: true, /* enable cmcdv2 event mode. FALSE by default */
mode: CMCD_MODE_QUERY, /*overrides global mode. JSON not supported */
interval: 10000, /* time in ms between regular requests. Default 30s or 0 to omit */
// enabledKeys: ['bg', 'br', 'e','int', 'sta', 'sid', 'cid', 'sf', 'v', 'ltc', 'msd', 'sta'], /* Currently only supports: 'sta', 'ts', 'sid', 'cid', 'sf', 'v', 'lb', 'pr' */
requestUrl: 'http://' + window.location.hostname + ':3000/cmcd/event-mode', /* mandatory, URL to send report */
requestMethod: 'POST', /* optional, get by default */
}
},
sid: 'b248658d-1d1a-4039-91d0-8c08ba597da5', /* session id send with each request */
cid: '21cf726cfe3d937b5f974f72bb5bd06a', /* content id send with each request */
mode: CMCD_MODE_QUERY, /* global mode if not specified in each mode */
// enabledKeys: ['bg', 'int', 'br', 'd', 'ot', 'tb' , 'bl', 'dl', 'mtp', 'nor', 'nrr', 'su' , 'bs', 'rtp' , 'cid', 'pr', 'sf', 'sid', 'st', 'v', 'sta', 'ltc', 'msd', 'sta']
}
}
});
player.setAutoPlay(true);
player.attachView(video);
player.attachSource(url);
}

function handleCmcdDataGeneratedEvent(event) {
log('type: ' + event.mediaType);
log('file: ' + event.url.split('/').pop())
var mode = player.getSettings().streaming.cmcd.mode;
const cmcdVersion = player.getSettings().streaming.cmcd.version;
var data = {};
if (cmcdVersion === 1) {
data = mode === CMCD_MODE_HEADER ? getKeysForHeaderMode(event) : getKeysForQueryMode(event);
} else if (cmcdVersion === 2){
/* Currently, headers are always generated in cmcd version 2 */
data = getKeysForHeaderMode(event);
}
var keys = Object.keys(data);
keys = keys.sort();
for (var key of keys) {
log(key.padEnd(4) + ': ' + event.cmcdData[key]);
}
log('');
}

function getKeysForQueryMode(event) {
var cmcdData = {};
var cmcdString = event.cmcdString;

extractKeyValuePairs(cmcdString, cmcdData);

return cmcdData;
}

function getKeysForHeaderMode(event) {
var cmcdData = {};
var keys = Object.keys(event.headers);

for (var key of keys) {
extractKeyValuePairs(event.headers[key], cmcdData)
}

return cmcdData
}

function extractKeyValuePairs(cmcdString, cmcdData) {
if (cmcdString === '') {
return;
}
var keyValuePairs = cmcdString.split(',');

keyValuePairs.forEach(function (keyValuePair) {
var data = keyValuePair.split('=');
var key = data[0];
var value = data[1];

cmcdData[key] = value;
})

}

function log(msg) {
msg = msg.length > 200 ? msg.substring(0, 200) + '...' : msg; /* to avoid repeated wrapping with large objects */
var tracePanel = document.getElementById('trace');
tracePanel.innerHTML += msg + '\n';
tracePanel.scrollTop = tracePanel.scrollHeight;
//console.log(msg);
}

</script>
</head>
<body>

<main>
<div class="container py-4">
<header class="pb-3 mb-4 border-bottom">
<img class=""
src="../lib/img/dashjs-logo.png"
width="200">
</header>
<div class="row">
<div class="col-md-12">
<div class="h-100 p-5 bg-light border rounded-3">
<h3>Live + AlternativeMPD + ListMPD + CMCD v2</h3>
<p>This sample shows how use AlternativeMPD and ListMPD to replace and Ad slot with an Ad Pod while sending all the CMCD v2 requests</p>
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-md-6">
<video controls="true"></video>
</div>
<div class="col-md-6">
<div class="form-floating">
<textarea class="form-control" placeholder="Sent CMCD data will be displayed here"
id="trace"></textarea>
<label for="trace">CMCD Data</label>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="code-output"></div>
</div>
</div>
<footer class="pt-3 mt-4 text-muted border-top">
&copy; DASH-IF
</footer>
</div>
</main>


<script>
document.addEventListener('DOMContentLoaded', function () {
init();
});
</script>
<script src="../highlighter.js"></script>
</body>
</html>
37 changes: 33 additions & 4 deletions samples/advanced/cmcd.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,33 @@
player.updateSettings({
streaming: {
cmcd: {
enabled: true, /* enable reporting of cmcd parameters */
enabled: true, /* global enable reporting of cmcd parameters */
version: 2, /* 1 is the default version */
reporting: {
requestMode: {
enabled: true, /* enable cmcdv2 request mode */
mode: CMCD_MODE_QUERY, /* overrides global mode */
},
responseMode: {
enabled: true, /* enable cmcdv2 response mode. FALSE by default */
mode: CMCD_MODE_QUERY, /* overrides global mode. JSON not supported */
enabledKeys: ['sid', 'cid', 'ts', 'url', 'br', 'd', 'ot', 'tb', 'v', 'sta', 'ttfb', 'ttlb','rc'], /* optional, overrides global keys */
requestUrl: 'http://localhost:3000/cmcd/response-mode', /*mandatory, URL to send report */
requestMethod: 'POST', /*optional, get by default */
},
eventMode: {
enabled: true, /* enable cmcdv2 event mode. FALSE by default */
mode: CMCD_MODE_QUERY, /*overrides global mode. JSON not supported */
interval: 10000, /* time in ms between regular requests. Default 30s or 0 to omit */
enabledKeys: ['sta', 'sid', 'cid', 'sf', 'v', 'ltc', 'msd', 'sta'], /* Currently only supports: 'sta', 'ts', 'sid', 'cid', 'sf', 'v', 'lb', 'pr' */
requestUrl: 'http://localhost:3000/cmcd/event-mode', /* mandatory, URL to send report */
requestMethod: 'POST', /* optional, get by default */
}
},
sid: 'b248658d-1d1a-4039-91d0-8c08ba597da5', /* session id send with each request */
cid: '21cf726cfe3d937b5f974f72bb5bd06a', /* content id send with each request */
mode: CMCD_MODE_QUERY,
enabledKeys: ['br', 'd', 'ot', 'tb' , 'bl', 'dl', 'mtp', 'nor', 'nrr', 'su' , 'bs', 'rtp' , 'cid', 'pr', 'sf', 'sid', 'st', 'v']
mode: CMCD_MODE_QUERY, /* global mode if not specified in each mode */
enabledKeys: ['br', 'd', 'ot', 'tb' , 'bl', 'dl', 'mtp', 'nor', 'nrr', 'su' , 'bs', 'rtp' , 'cid', 'pr', 'sf', 'sid', 'st', 'v', 'sta', 'ltc', 'msd', 'sta']
}
}
});
Expand All @@ -63,7 +85,14 @@
log('type: ' + event.mediaType);
log('file: ' + event.url.split('/').pop())
var mode = player.getSettings().streaming.cmcd.mode;
var data = mode === CMCD_MODE_HEADER ? getKeysForHeaderMode(event) : getKeysForQueryMode(event);
const cmcdVersion = player.getSettings().streaming.cmcd.version;
var data = {};
if (cmcdVersion === 1) {
data = mode === CMCD_MODE_HEADER ? getKeysForHeaderMode(event) : getKeysForQueryMode(event);
} else if (cmcdVersion === 2){
/* Currently, headers are always generated in cmcd version 2 */
data = getKeysForHeaderMode(event);
}
var keys = Object.keys(data);
keys = keys.sort();
for (var key of keys) {
Expand Down
19 changes: 19 additions & 0 deletions samples/advanced/mpds/ad-pod.mpd
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:mpeg:dash:schema:mpd:2011"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
type="list"
minBufferTime="PT1S"
profiles="urn:mpeg:dash:profile:list:2024"
publishTime="2025-01-14T20:29:31.022Z">
<Period id="1" duration="PT10S">
<ImportedMPD
uri="https://redirector.gvt1.com/api/manifest/dash/id/f1be9c477e89fd68/itag/0/source/dclk_video_ads/acao/yes/cpn/qOvh4O0YAa2jPbET/ctier/L/ei/CfJEZ46ED5SPobIP0NmgiQ0/hfr/all/ip/0.0.0.0/keepalive/yes/playlist_type/DVR/requiressl/yes/susc/dvc/xpc/Eghovf3BOnoBAQ%3D%3D/expire/1764107657/sparams/expire,ei,ip,requiressl,source,itag,hfr,acao,ctier,id,playlist_type,susc,xpc/sig/AJfQdSswRAIgVHu-YX-65-daHfdpM5veBIhJDBnU9O7E7FPNelDibkICIFMOgZMWJbFeH3Z2BE8umm5PaUMZuBOwCWiffDy2kh1B/file/index.mpd"
earliestResolutionTimeOffset="0" />
</Period>
<Period id="2" duration="PT10S">
<ImportedMPD
uri="https://redirector.gvt1.com/api/manifest/dash/id/f1be9c477e89fd68/itag/0/source/dclk_video_ads/acao/yes/cpn/qOvh4O0YAa2jPbET/ctier/L/ei/CfJEZ46ED5SPobIP0NmgiQ0/hfr/all/ip/0.0.0.0/keepalive/yes/playlist_type/DVR/requiressl/yes/susc/dvc/xpc/Eghovf3BOnoBAQ%3D%3D/expire/1764107657/sparams/expire,ei,ip,requiressl,source,itag,hfr,acao,ctier,id,playlist_type,susc,xpc/sig/AJfQdSswRAIgVHu-YX-65-daHfdpM5veBIhJDBnU9O7E7FPNelDibkICIFMOgZMWJbFeH3Z2BE8umm5PaUMZuBOwCWiffDy2kh1B/file/index.mpd"
earliestResolutionTimeOffset="10" />
</Period>
</MPD>
49 changes: 49 additions & 0 deletions samples/advanced/mpds/live-alternative-ads.mpd
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
xmlns:cmcd="http://qualabs.com/cmcd"
profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple"
type="dynamic" availabilityStartTime="1970-01-01T00:00:00Z" publishTime="1970-01-01T00:00:00Z"
minimumUpdatePeriod="PT2S" minBufferTime="PT2S" timeShiftBufferDepth="PT1M"
maxSegmentDuration="PT2S">
<BaseURL>https://livesim.dashif.org/livesim2/scte35_2/testpic_2s/</BaseURL>
<Period id="P0" start="PT0S">
<EventStream xmlns="" schemeIdUri="urn:mpeg:dash:event:alternativeMPD:2022" timescale="1000">
<Event id="ad1_vast2sgai" presentationTime="10000" duration="20000">
<AlternativeMPD uri="http://localhost:3001/samples/advanced/mpds/ad-pod.mpd"
earliestResolutionTimeOffset="5000" mode="replace" returnOffset="0" cmcd:RequestModeEnabled="false" />
</Event>
<Event id="ad2_mpd" presentationTime="40000" duration="5000">
<AlternativeMPD
uri="https://comcast-dash-6-assets.s3.us-east-2.amazonaws.com/TestAssets/MediaOfflineErrorAsset/stream.mpd"
earliestResolutionTimeOffset="5000" mode="replace" returnOffset="0" />
</Event>
<Event id="ad3_mpd" presentationTime="70000" duration="5000">
<AlternativeMPD uri="https://media.axprod.net/TestVectors/v7-Clear/Manifest_1080p.mpd"
earliestResolutionTimeOffset="5000" mode="replace" returnOffset="0" />
</Event>
</EventStream>
<AdaptationSet lang="en" contentType="audio" segmentAlignment="true" mimeType="audio/mp4"
startWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate media="$RepresentationID$/$Number$.m4s"
initialization="$RepresentationID$/init.mp4" duration="2" startNumber="0" />
<Representation id="A48" bandwidth="48000" audioSamplingRate="48000" codecs="mp4a.40.2">
<AudioChannelConfiguration
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
</Representation>
</AdaptationSet>
<AdaptationSet contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360"
maxHeight="360" maxFrameRate="60/2" segmentAlignment="true" mimeType="video/mp4"
startWithSAP="1">
<InbandEventStream schemeIdUri="urn:scte:scte35:2013:bin" />
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate media="$RepresentationID$/$Number$.m4s"
initialization="$RepresentationID$/init.mp4" duration="2" startNumber="0" />
<Representation id="V300" bandwidth="300000" width="640" height="360" sar="1:1"
frameRate="60/2" codecs="avc1.64001e" />
</AdaptationSet>
</Period>
<UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-xsdate:2014"
value="https://time.akamai.com/?iso&amp;ms" />
</MPD>
Loading
Loading