18
18
Dash . dependencies . BaseURLExtensions = function ( ) {
19
19
"use strict" ;
20
20
21
- var url ,
22
- range ,
23
- searching = false ,
24
- bytesLoaded = 0 ,
25
- bytesToLoad = 1500 ,
26
-
27
21
// From YouTube player. Reformatted for JSLint.
28
- parseSIDX = function ( ab , ab_first_byte_offset ) {
22
+ var parseSIDX = function ( ab , ab_first_byte_offset ) {
29
23
var d = new DataView ( ab ) ,
30
24
sidx = { } ,
31
25
pos = 0 ,
@@ -152,11 +146,10 @@ Dash.dependencies.BaseURLExtensions = function () {
152
146
return Q . when ( segments ) ;
153
147
} ,
154
148
155
- findInit = function ( data ) {
149
+ findInit = function ( data , info ) {
156
150
var deferred = Q . defer ( ) ,
157
151
start ,
158
152
end ,
159
- range ,
160
153
d = new DataView ( data ) ,
161
154
pos = 0 ,
162
155
type = "" ,
@@ -166,6 +159,7 @@ Dash.dependencies.BaseURLExtensions = function () {
166
159
c ,
167
160
request ,
168
161
loaded = false ,
162
+ irange ,
169
163
self = this ;
170
164
171
165
self . debug . log ( "Searching for initialization." ) ;
@@ -196,8 +190,8 @@ Dash.dependencies.BaseURLExtensions = function () {
196
190
// Throw error is no moov is found in the entire file.
197
191
// Protection from loading the entire file?
198
192
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 ;
201
195
202
196
request = new XMLHttpRequest ( ) ;
203
197
@@ -209,7 +203,7 @@ Dash.dependencies.BaseURLExtensions = function () {
209
203
210
204
request . onload = function ( ) {
211
205
loaded = true ;
212
- bytesLoaded = range . end ;
206
+ info . bytesLoaded = info . range . end ;
213
207
findInit . call ( self , request . response ) . then (
214
208
function ( segments ) {
215
209
deferred . resolve ( segments ) ;
@@ -222,18 +216,18 @@ Dash.dependencies.BaseURLExtensions = function () {
222
216
} ;
223
217
224
218
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 ) ;
227
221
request . send ( null ) ;
228
222
} else {
229
223
// Case 2
230
224
// We have the entire range, so continue.
231
225
start = pos - 8 ;
232
226
end = start + size - 1 ;
233
- range = start + "-" + end ;
227
+ irange = start + "-" + end ;
234
228
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 ) ;
237
231
}
238
232
239
233
return deferred . promise ;
@@ -243,14 +237,19 @@ Dash.dependencies.BaseURLExtensions = function () {
243
237
var deferred = Q . defer ( ) ,
244
238
request = new XMLHttpRequest ( ) ,
245
239
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
+ } ;
250
249
251
250
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 ;
254
253
255
254
request . onloadend = function ( e ) {
256
255
if ( ! loaded ) {
@@ -260,8 +259,8 @@ Dash.dependencies.BaseURLExtensions = function () {
260
259
261
260
request . onload = function ( ) {
262
261
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 (
265
264
function ( range ) {
266
265
deferred . resolve ( range ) ;
267
266
}
@@ -273,15 +272,15 @@ Dash.dependencies.BaseURLExtensions = function () {
273
272
} ;
274
273
275
274
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 ) ;
278
277
request . send ( null ) ;
279
- self . debug . log ( "Perform init search: " + url ) ;
278
+ self . debug . log ( "Perform init search: " + info . url ) ;
280
279
281
280
return deferred . promise ;
282
281
} ,
283
282
284
- findSIDX = function ( data ) {
283
+ findSIDX = function ( data , info ) {
285
284
var deferred = Q . defer ( ) ,
286
285
d = new DataView ( data ) ,
287
286
request = new XMLHttpRequest ( ) ,
@@ -299,7 +298,7 @@ Dash.dependencies.BaseURLExtensions = function () {
299
298
self = this ;
300
299
301
300
self . debug . log ( "Searching for SIDX box." ) ;
302
- self . debug . log ( bytesLoaded + " bytes loaded." ) ;
301
+ self . debug . log ( info . bytesLoaded + " bytes loaded." ) ;
303
302
304
303
while ( type !== "sidx" && pos < d . byteLength ) {
305
304
size = d . getUint32 ( pos ) ; // subtract 8 for including the size and type
@@ -327,14 +326,14 @@ Dash.dependencies.BaseURLExtensions = function () {
327
326
// Throw error is no sidx is found in the entire file.
328
327
// Protection from loading the entire file?
329
328
throw ( "Could not find SIDX box!" ) ;
330
- } else if ( bytesAvailable < size ) {
329
+ } else if ( bytesAvailable < ( size - 8 ) ) {
331
330
// Case 2
332
331
// We don't have the entire box.
333
332
// Increase the number of bytes to read and load again.
334
333
self . debug . log ( "Found SIDX but we don't have all of it." ) ;
335
334
336
- range . start = 0 ;
337
- range . end = bytesLoaded + ( size - bytesAvailable ) ;
335
+ info . range . start = 0 ;
336
+ info . range . end = info . bytesLoaded + ( size - bytesAvailable ) ;
338
337
339
338
request . onloadend = function ( e ) {
340
339
if ( ! loaded ) {
@@ -344,8 +343,8 @@ Dash.dependencies.BaseURLExtensions = function () {
344
343
345
344
request . onload = function ( ) {
346
345
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 (
349
348
function ( segments ) {
350
349
deferred . resolve ( segments ) ;
351
350
}
@@ -357,19 +356,19 @@ Dash.dependencies.BaseURLExtensions = function () {
357
356
} ;
358
357
359
358
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 ) ;
362
361
request . send ( null ) ;
363
362
} else {
364
363
// Case 3
365
364
// 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 ;
368
367
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 ) ;
371
370
372
- parsed = this . parseSIDX . call ( this , sidxBytes , range . start ) ;
371
+ parsed = this . parseSIDX . call ( this , sidxBytes , info . range . start ) ;
373
372
374
373
// We need to check to see if we are loading multiple sidx.
375
374
// For now just check the first reference and assume they are all the same.
@@ -391,7 +390,7 @@ Dash.dependencies.BaseURLExtensions = function () {
391
390
se = ref [ j ] . offset + ref [ j ] . size - 1 ;
392
391
r = ss + "-" + se ;
393
392
394
- funcs . push ( this . loadSegments . call ( self , url , r ) ) ;
393
+ funcs . push ( this . loadSegments . call ( self , info . url , r ) ) ;
395
394
}
396
395
397
396
Q . all ( funcs ) . then (
@@ -406,7 +405,7 @@ Dash.dependencies.BaseURLExtensions = function () {
406
405
407
406
} else {
408
407
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 (
410
409
function ( segments ) {
411
410
deferred . resolve ( segments ) ;
412
411
}
@@ -422,22 +421,27 @@ Dash.dependencies.BaseURLExtensions = function () {
422
421
request = new XMLHttpRequest ( ) ,
423
422
parts ,
424
423
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
+ } ;
429
433
430
434
// We might not know exactly where the sidx box is.
431
435
// Load the first n bytes (say 1500) and look for it.
432
436
if ( theRange === null ) {
433
437
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 ;
437
441
} else {
438
442
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 ] ) ;
441
445
}
442
446
443
447
request . onloadend = function ( e ) {
@@ -451,15 +455,15 @@ Dash.dependencies.BaseURLExtensions = function () {
451
455
452
456
// If we didn't know where the SIDX box was, we have to look for it.
453
457
// 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 (
457
461
function ( segments ) {
458
462
deferred . resolve ( segments ) ;
459
463
}
460
464
) ;
461
465
} else {
462
- parseSegments . call ( self , request . response , url , range . start ) . then (
466
+ parseSegments . call ( self , request . response , info . url , info . range . start ) . then (
463
467
function ( segments ) {
464
468
deferred . resolve ( segments ) ;
465
469
}
@@ -472,10 +476,10 @@ Dash.dependencies.BaseURLExtensions = function () {
472
476
} ;
473
477
474
478
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 ) ;
477
481
request . send ( null ) ;
478
- self . debug . log ( "Perform SIDX load: " + url ) ;
482
+ self . debug . log ( "Perform SIDX load: " + info . url ) ;
479
483
480
484
return deferred . promise ;
481
485
} ;
0 commit comments