Skip to content

Commit b79e7e9

Browse files
committed
0.2.1
Add support for SegmentBase manifests with reference_type = 1. (Multi-level SIDX.) Finish externalizing live toggle. The player no longer attempts to discover liveness from the manifest. Add a live toggle to the main UI. Fix an issue where a custom value in the text input was ignored. Fixed some bugs and clean up the SIDX loading. Clean up some of the UI. Added some new MediaSource test pages. Expanded test.html to work with byte ranges. Redid how live works again to support particular streams. Live still needs more work.
1 parent 177a420 commit b79e7e9

File tree

8 files changed

+531
-109
lines changed

8 files changed

+531
-109
lines changed

app/css/main.css

+14-1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@ p {
9494

9595
border-bottom: 2px solid #dce4ec;
9696
}
97+
98+
.tooltip-debug-box {
99+
background-color: #FFFFFF;
100+
/*border: 2px solid #dce4ec;*/
101+
/*border-radius: 6px;*/
102+
/*position: relative;*/
103+
border-left: 2px solid #dce4ec;
104+
border-right: 2px solid #dce4ec;
105+
}
97106
/*
98107
.tooltip-box:before {
99108
content: "";
@@ -257,7 +266,11 @@ p {
257266
.tab-content {
258267
width: 100%;
259268
height: 100%;
260-
padding: 10px;
269+
padding-left: 10px;
270+
padding-top: 10px;
271+
padding-bottom: 10px;
272+
margin-bottom: 20px;
273+
border: 2px solid #dce4ec;
261274
}
262275

263276
.tab-content div {

app/js/dash/BaseURLExtensions.js

+64-60
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,8 @@
1818
Dash.dependencies.BaseURLExtensions = function () {
1919
"use strict";
2020

21-
var url,
22-
range,
23-
searching = false,
24-
bytesLoaded = 0,
25-
bytesToLoad = 1500,
26-
2721
// From YouTube player. Reformatted for JSLint.
28-
parseSIDX = function (ab, ab_first_byte_offset) {
22+
var parseSIDX = function (ab, ab_first_byte_offset) {
2923
var d = new DataView(ab),
3024
sidx = {},
3125
pos = 0,
@@ -152,11 +146,10 @@ Dash.dependencies.BaseURLExtensions = function () {
152146
return Q.when(segments);
153147
},
154148

155-
findInit = function (data) {
149+
findInit = function (data, info) {
156150
var deferred = Q.defer(),
157151
start,
158152
end,
159-
range,
160153
d = new DataView(data),
161154
pos = 0,
162155
type = "",
@@ -166,6 +159,7 @@ Dash.dependencies.BaseURLExtensions = function () {
166159
c,
167160
request,
168161
loaded = false,
162+
irange,
169163
self = this;
170164

171165
self.debug.log("Searching for initialization.");
@@ -196,8 +190,8 @@ Dash.dependencies.BaseURLExtensions = function () {
196190
// Throw error is no moov is found in the entire file.
197191
// Protection from loading the entire file?
198192
self.debug.log("Loading more bytes to find initialization.");
199-
range.start = 0;
200-
range.end = bytesLoaded + bytesToLoad;
193+
info.range.start = 0;
194+
info.range.end = info.bytesLoaded + info.bytesToLoad;
201195

202196
request = new XMLHttpRequest();
203197

@@ -209,7 +203,7 @@ Dash.dependencies.BaseURLExtensions = function () {
209203

210204
request.onload = function () {
211205
loaded = true;
212-
bytesLoaded = range.end;
206+
info.bytesLoaded = info.range.end;
213207
findInit.call(self, request.response).then(
214208
function (segments) {
215209
deferred.resolve(segments);
@@ -222,18 +216,18 @@ Dash.dependencies.BaseURLExtensions = function () {
222216
};
223217

224218
request.responseType = "arraybuffer";
225-
request.open("GET", url);
226-
request.setRequestHeader("Range", "bytes=" + range.start + "-" + range.end);
219+
request.open("GET", info.url);
220+
request.setRequestHeader("Range", "bytes=" + info.range.start + "-" + info.range.end);
227221
request.send(null);
228222
} else {
229223
// Case 2
230224
// We have the entire range, so continue.
231225
start = pos - 8;
232226
end = start + size - 1;
233-
range = start + "-" + end;
227+
irange = start + "-" + end;
234228

235-
self.debug.log("Found the initialization. Range: " + range);
236-
deferred.resolve(range);
229+
self.debug.log("Found the initialization. Range: " + irange);
230+
deferred.resolve(irange);
237231
}
238232

239233
return deferred.promise;
@@ -243,14 +237,19 @@ Dash.dependencies.BaseURLExtensions = function () {
243237
var deferred = Q.defer(),
244238
request = new XMLHttpRequest(),
245239
loaded = false,
246-
self = this;
247-
248-
url = media;
249-
range = {};
240+
self = this,
241+
info = {
242+
url: media,
243+
range: {},
244+
searching: false,
245+
bytesLoaded: 0,
246+
bytesToLoad: 1500,
247+
request: request
248+
};
250249

251250
self.debug.log("Start searching for initialization.");
252-
range.start = 0;
253-
range.end = bytesToLoad;
251+
info.range.start = 0;
252+
info.range.end = info.bytesToLoad;
254253

255254
request.onloadend = function (e) {
256255
if (!loaded) {
@@ -260,8 +259,8 @@ Dash.dependencies.BaseURLExtensions = function () {
260259

261260
request.onload = function () {
262261
loaded = true;
263-
bytesLoaded = range.end;
264-
findInit.call(self, request.response).then(
262+
info.bytesLoaded = info.range.end;
263+
findInit.call(self, request.response, info).then(
265264
function (range) {
266265
deferred.resolve(range);
267266
}
@@ -273,15 +272,15 @@ Dash.dependencies.BaseURLExtensions = function () {
273272
};
274273

275274
request.responseType = "arraybuffer";
276-
request.open("GET", url);
277-
request.setRequestHeader("Range", "bytes=" + range.start + "-" + range.end);
275+
request.open("GET", info.url);
276+
request.setRequestHeader("Range", "bytes=" + info.range.start + "-" + info.range.end);
278277
request.send(null);
279-
self.debug.log("Perform init search: " + url);
278+
self.debug.log("Perform init search: " + info.url);
280279

281280
return deferred.promise;
282281
},
283282

284-
findSIDX = function (data) {
283+
findSIDX = function (data, info) {
285284
var deferred = Q.defer(),
286285
d = new DataView(data),
287286
request = new XMLHttpRequest(),
@@ -299,7 +298,7 @@ Dash.dependencies.BaseURLExtensions = function () {
299298
self = this;
300299

301300
self.debug.log("Searching for SIDX box.");
302-
self.debug.log(bytesLoaded + " bytes loaded.");
301+
self.debug.log(info.bytesLoaded + " bytes loaded.");
303302

304303
while (type !== "sidx" && pos < d.byteLength) {
305304
size = d.getUint32(pos); // subtract 8 for including the size and type
@@ -327,14 +326,14 @@ Dash.dependencies.BaseURLExtensions = function () {
327326
// Throw error is no sidx is found in the entire file.
328327
// Protection from loading the entire file?
329328
throw ("Could not find SIDX box!");
330-
} else if (bytesAvailable < size) {
329+
} else if (bytesAvailable < (size - 8)) {
331330
// Case 2
332331
// We don't have the entire box.
333332
// Increase the number of bytes to read and load again.
334333
self.debug.log("Found SIDX but we don't have all of it.");
335334

336-
range.start = 0;
337-
range.end = bytesLoaded + (size - bytesAvailable);
335+
info.range.start = 0;
336+
info.range.end = info.bytesLoaded + (size - bytesAvailable);
338337

339338
request.onloadend = function (e) {
340339
if (!loaded) {
@@ -344,8 +343,8 @@ Dash.dependencies.BaseURLExtensions = function () {
344343

345344
request.onload = function () {
346345
loaded = true;
347-
bytesLoaded = range.end;
348-
findSIDX.call(self, request.response).then(
346+
info.bytesLoaded = info.range.end;
347+
findSIDX.call(self, request.response, info).then(
349348
function (segments) {
350349
deferred.resolve(segments);
351350
}
@@ -357,19 +356,19 @@ Dash.dependencies.BaseURLExtensions = function () {
357356
};
358357

359358
request.responseType = "arraybuffer";
360-
request.open("GET", url);
361-
request.setRequestHeader("Range", "bytes=" + range.start + "-" + range.end);
359+
request.open("GET", info.url);
360+
request.setRequestHeader("Range", "bytes=" + info.range.start + "-" + info.range.end);
362361
request.send(null);
363362
} else {
364363
// Case 3
365364
// We have the entire box, so parse it and continue.
366-
range.start = pos - 8;
367-
range.end = range.start + size;
365+
info.range.start = pos - 8;
366+
info.range.end = info.range.start + size;
368367

369-
self.debug.log("Found the SIDX box. Start: " + range.start + " | End: " + range.end);
370-
sidxBytes = data.slice(range.start, range.end);
368+
self.debug.log("Found the SIDX box. Start: " + info.range.start + " | End: " + info.range.end);
369+
sidxBytes = data.slice(info.range.start, info.range.end);
371370

372-
parsed = this.parseSIDX.call(this, sidxBytes, range.start);
371+
parsed = this.parseSIDX.call(this, sidxBytes, info.range.start);
373372

374373
// We need to check to see if we are loading multiple sidx.
375374
// For now just check the first reference and assume they are all the same.
@@ -391,7 +390,7 @@ Dash.dependencies.BaseURLExtensions = function () {
391390
se = ref[j].offset + ref[j].size - 1;
392391
r = ss + "-" + se;
393392

394-
funcs.push(this.loadSegments.call(self, url, r));
393+
funcs.push(this.loadSegments.call(self, info.url, r));
395394
}
396395

397396
Q.all(funcs).then(
@@ -406,7 +405,7 @@ Dash.dependencies.BaseURLExtensions = function () {
406405

407406
} else {
408407
self.debug.log("Parsing segments from SIDX.");
409-
parseSegments.call(self, sidxBytes, url, range.start).then(
408+
parseSegments.call(self, sidxBytes, info.url, info.range.start).then(
410409
function (segments) {
411410
deferred.resolve(segments);
412411
}
@@ -422,22 +421,27 @@ Dash.dependencies.BaseURLExtensions = function () {
422421
request = new XMLHttpRequest(),
423422
parts,
424423
loaded = false,
425-
self = this;
426-
427-
url = media;
428-
range = {};
424+
self = this,
425+
info = {
426+
url: media,
427+
range: {},
428+
searching: false,
429+
bytesLoaded: 0,
430+
bytesToLoad: 1500,
431+
request: request
432+
};
429433

430434
// We might not know exactly where the sidx box is.
431435
// Load the first n bytes (say 1500) and look for it.
432436
if (theRange === null) {
433437
self.debug.log("No known range for SIDX request.");
434-
searching = true;
435-
range.start = 0;
436-
range.end = bytesToLoad;
438+
info.searching = true;
439+
info.range.start = 0;
440+
info.range.end = info.bytesToLoad;
437441
} else {
438442
parts = theRange.split("-");
439-
range.start = parseFloat(parts[0]);
440-
range.end = parseFloat(parts[1]);
443+
info.range.start = parseFloat(parts[0]);
444+
info.range.end = parseFloat(parts[1]);
441445
}
442446

443447
request.onloadend = function (e) {
@@ -451,15 +455,15 @@ Dash.dependencies.BaseURLExtensions = function () {
451455

452456
// If we didn't know where the SIDX box was, we have to look for it.
453457
// Iterate over the data checking out the boxes to find it.
454-
if (searching) {
455-
bytesLoaded = range.end;
456-
findSIDX.call(self, request.response).then(
458+
if (info.searching) {
459+
info.bytesLoaded = info.range.end;
460+
findSIDX.call(self, request.response, info).then(
457461
function (segments) {
458462
deferred.resolve(segments);
459463
}
460464
);
461465
} else {
462-
parseSegments.call(self, request.response, url, range.start).then(
466+
parseSegments.call(self, request.response, info.url, info.range.start).then(
463467
function (segments) {
464468
deferred.resolve(segments);
465469
}
@@ -472,10 +476,10 @@ Dash.dependencies.BaseURLExtensions = function () {
472476
};
473477

474478
request.responseType = "arraybuffer";
475-
request.open("GET", url);
476-
request.setRequestHeader("Range", "bytes=" + range.start + "-" + range.end);
479+
request.open("GET", info.url);
480+
request.setRequestHeader("Range", "bytes=" + info.range.start + "-" + info.range.end);
477481
request.send(null);
478-
self.debug.log("Perform SIDX load: " + url);
482+
self.debug.log("Perform SIDX load: " + info.url);
479483

480484
return deferred.promise;
481485
};

0 commit comments

Comments
 (0)