@@ -26,6 +26,12 @@ type LastRequestedSegmentInfo = {
26
26
isLiveStream : boolean ;
27
27
} ;
28
28
29
+ type ObsoleteSegments = {
30
+ live : string [ ] ;
31
+ vod : string [ ] ;
32
+ vodDifferentQuality : string [ ] ;
33
+ } ;
34
+
29
35
const getStorageItemId = ( streamId : string , segmentId : number ) =>
30
36
`${ streamId } |${ segmentId } ` ;
31
37
@@ -267,49 +273,43 @@ export class SegmentMemoryStorage implements SegmentStorage {
267
273
return [ ] ;
268
274
}
269
275
270
- const obsoleteSegments : string [ ] = [ ] ;
276
+ const obsoleteSegments : ObsoleteSegments = {
277
+ live : [ ] ,
278
+ vod : [ ] ,
279
+ vodDifferentQuality : [ ] ,
280
+ } ;
271
281
const playbackPosition = this . currentPlayback . position ;
272
282
273
283
for ( const segmentData of this . cache . values ( ) ) {
274
- const { streamId, segmentId } = segmentData ;
284
+ const { streamId, segmentId, endTime , streamType } = segmentData ;
275
285
const storageId = getStorageItemId ( streamId , segmentId ) ;
276
-
277
- const shouldRemove = this . shouldRemoveSegment (
278
- segmentData ,
279
- isLiveStream ,
280
- currentStreamId ,
281
- playbackPosition ,
286
+ const highDemandTimeWindow = this . getStreamTimeWindow (
287
+ streamType ,
288
+ "highDemandTimeWindow" ,
282
289
) ;
283
290
284
- if ( shouldRemove ) obsoleteSegments . push ( storageId ) ;
285
- }
291
+ if ( playbackPosition <= endTime ) continue ;
286
292
287
- return obsoleteSegments ;
288
- }
293
+ if ( isLiveStream ) {
294
+ if ( playbackPosition > endTime + highDemandTimeWindow ) {
295
+ obsoleteSegments . live . push ( storageId ) ;
296
+ }
297
+ continue ;
298
+ }
289
299
290
- private shouldRemoveSegment (
291
- segmentData : SegmentDataItem ,
292
- isLiveStream : boolean ,
293
- currentStreamId : string ,
294
- currentPlaybackPosition : number ,
295
- ) : boolean {
296
- const { streamId, endTime, streamType } = segmentData ;
297
- const highDemandTimeWindow = this . getStreamTimeWindow (
298
- streamType ,
299
- "highDemandTimeWindow" ,
300
- ) ;
300
+ if ( streamId !== currentStreamId ) {
301
+ obsoleteSegments . vodDifferentQuality . push ( storageId ) ;
302
+ continue ;
303
+ }
301
304
302
- if ( currentPlaybackPosition <= endTime ) return false ;
303
- if ( streamId !== currentStreamId ) return true ;
304
- if (
305
- isLiveStream &&
306
- currentPlaybackPosition > highDemandTimeWindow + endTime
307
- ) {
308
- return true ;
305
+ obsoleteSegments . vod . push ( storageId ) ;
309
306
}
310
- if ( ! isLiveStream ) return true ;
311
307
312
- return false ;
308
+ if ( obsoleteSegments . live . length > 0 ) return obsoleteSegments . live ;
309
+ if ( obsoleteSegments . vodDifferentQuality . length > 0 ) {
310
+ return obsoleteSegments . vodDifferentQuality ;
311
+ }
312
+ return obsoleteSegments . vod ;
313
313
}
314
314
315
315
private setMemoryStorageLimit ( ) {
0 commit comments