@@ -12,6 +12,7 @@ goog.require('shaka.media.InitSegmentReference');
12
12
goog . require ( 'shaka.media.SegmentIterator' ) ;
13
13
goog . require ( 'shaka.media.SegmentReference' ) ;
14
14
goog . require ( 'shaka.net.NetworkingEngine' ) ;
15
+ goog . require ( 'shaka.util.Error' ) ;
15
16
goog . require ( 'shaka.util.Uint8ArrayUtils' ) ;
16
17
17
18
@@ -74,6 +75,7 @@ shaka.media.SegmentPrefetch = class {
74
75
*
75
76
* @param {number } currTime
76
77
* @param {boolean= } skipFirst
78
+ * @return {!Promise }
77
79
* @public
78
80
*/
79
81
prefetchSegmentsByTime ( currTime , skipFirst = false ) {
@@ -83,19 +85,20 @@ shaka.media.SegmentPrefetch = class {
83
85
const logPrefix = shaka . media . SegmentPrefetch . logPrefix_ ( this . stream_ ) ;
84
86
if ( ! this . stream_ . segmentIndex ) {
85
87
shaka . log . debug ( logPrefix , 'missing segmentIndex' ) ;
86
- return ;
88
+ return Promise . resolve ( ) ;
87
89
}
88
90
if ( ! this . iterator_ ) {
89
91
this . iterator_ = this . stream_ . segmentIndex . getIteratorForTime (
90
92
currTime , /* allowNonIndepedent= */ true , this . reverse_ ) ;
91
93
}
92
94
if ( ! this . iterator_ ) {
93
95
shaka . log . debug ( logPrefix , 'missing iterator' ) ;
94
- return ;
96
+ return Promise . resolve ( ) ;
95
97
}
96
98
if ( skipFirst ) {
97
99
this . iterator_ . next ( ) ;
98
100
}
101
+ const promises = [ ] ;
99
102
while ( this . segmentPrefetchMap_ . size < this . prefetchLimit_ ) {
100
103
const reference = this . iterator_ . next ( ) . value ;
101
104
if ( ! reference ) {
@@ -115,22 +118,26 @@ shaka.media.SegmentPrefetch = class {
115
118
prefetchAllowed = false ;
116
119
}
117
120
if ( prefetchAllowed && reference . initSegmentReference ) {
118
- this . prefetchInitSegment ( reference . initSegmentReference ) ;
121
+ promises . push ( this . prefetchInitSegment (
122
+ reference . initSegmentReference ) ) ;
119
123
}
120
124
if ( prefetchAllowed && ! this . segmentPrefetchMap_ . has ( reference ) ) {
121
125
const segmentPrefetchOperation =
122
126
new shaka . media . SegmentPrefetchOperation ( this . fetchDispatcher_ ) ;
123
- segmentPrefetchOperation . dispatchFetch ( reference , this . stream_ ) ;
127
+ promises . push ( segmentPrefetchOperation . dispatchFetch (
128
+ reference , this . stream_ ) ) ;
124
129
this . segmentPrefetchMap_ . set ( reference , segmentPrefetchOperation ) ;
125
130
}
126
131
}
127
132
this . clearInitSegments_ ( ) ;
133
+ return Promise . all ( promises ) ;
128
134
}
129
135
130
136
/**
131
137
* Fetch init segment.
132
138
*
133
139
* @param {!shaka.media.InitSegmentReference } initSegmentReference
140
+ * @return {!Promise }
134
141
*/
135
142
prefetchInitSegment ( initSegmentReference ) {
136
143
goog . asserts . assert ( this . prefetchLimit_ > 0 ,
@@ -139,11 +146,11 @@ shaka.media.SegmentPrefetch = class {
139
146
const logPrefix = shaka . media . SegmentPrefetch . logPrefix_ ( this . stream_ ) ;
140
147
if ( ! this . stream_ . segmentIndex ) {
141
148
shaka . log . debug ( logPrefix , 'missing segmentIndex' ) ;
142
- return ;
149
+ return Promise . resolve ( ) ;
143
150
}
144
151
145
152
if ( initSegmentReference . getSegmentData ( ) ) {
146
- return ;
153
+ return Promise . resolve ( ) ;
147
154
}
148
155
149
156
// init segments are ignored from the prefetch limit
@@ -152,14 +159,16 @@ shaka.media.SegmentPrefetch = class {
152
159
return shaka . media . InitSegmentReference . equal (
153
160
reference , initSegmentReference ) ;
154
161
} ) ;
155
- if ( ! someReference ) {
156
- const segmentPrefetchOperation =
157
- new shaka . media . SegmentPrefetchOperation ( this . fetchDispatcher_ ) ;
158
- segmentPrefetchOperation . dispatchFetch (
159
- initSegmentReference , this . stream_ ) ;
160
- this . initSegmentPrefetchMap_ . set (
161
- initSegmentReference , segmentPrefetchOperation ) ;
162
+ if ( someReference ) {
163
+ return Promise . resolve ( ) ;
162
164
}
165
+ const segmentPrefetchOperation = new shaka . media . SegmentPrefetchOperation (
166
+ this . fetchDispatcher_ ) ;
167
+ const promise = segmentPrefetchOperation . dispatchFetch (
168
+ initSegmentReference , this . stream_ ) ;
169
+ this . initSegmentPrefetchMap_ . set (
170
+ initSegmentReference , segmentPrefetchOperation ) ;
171
+ return promise ;
163
172
}
164
173
165
174
/**
@@ -415,6 +424,7 @@ shaka.media.SegmentPrefetchOperation = class {
415
424
* @param {!(shaka.media.SegmentReference|shaka.media.InitSegmentReference) }
416
425
* reference
417
426
* @param {!shaka.extern.Stream } stream
427
+ * @return {!Promise }
418
428
* @public
419
429
*/
420
430
dispatchFetch ( reference , stream ) {
@@ -433,6 +443,15 @@ shaka.media.SegmentPrefetchOperation = class {
433
443
buffered = new Uint8Array ( 0 ) ;
434
444
}
435
445
} ) ;
446
+ return this . operation_ . promise . catch ( ( e ) => {
447
+ // Ignore OPERATION_ABORTED errors.
448
+ if ( e instanceof shaka . util . Error &&
449
+ e . code == shaka . util . Error . Code . OPERATION_ABORTED ) {
450
+ return Promise . resolve ( ) ;
451
+ }
452
+ // Continue to surface other errors.
453
+ return Promise . reject ( e ) ;
454
+ } ) ;
436
455
}
437
456
438
457
/**
0 commit comments