@@ -8,7 +8,12 @@ import { LevelDetails } from '../loader/level-details';
8
8
import type { Level } from '../types/level' ;
9
9
import { DateRange } from '../loader/date-range' ;
10
10
11
- type FragmentIntersection = ( oldFrag : Fragment , newFrag : Fragment ) => void ;
11
+ type FragmentIntersection = (
12
+ oldFrag : Fragment ,
13
+ newFrag : Fragment ,
14
+ newFragIndex : number ,
15
+ newFragments : Fragment [ ] ,
16
+ ) => void ;
12
17
type PartIntersection = ( oldPart : Part , newPart : Part ) => void ;
13
18
14
19
export function updatePTS (
@@ -106,7 +111,7 @@ export function updateFragPTSDTS(
106
111
if ( ! details || sn < details . startSN || sn > details . endSN ) {
107
112
return 0 ;
108
113
}
109
- let i ;
114
+ let i : number ;
110
115
const fragIdx = sn - details . startSN ;
111
116
const fragments = details . fragments ;
112
117
// update frag reference in fragments array
@@ -152,18 +157,19 @@ export function mergeDetails(
152
157
delete oldDetails . fragmentHint . endPTS ;
153
158
}
154
159
// check if old/new playlists have fragments in common
155
- // loop through overlapping SN and update startPTS , cc, and duration if any found
156
- let ccOffset = 0 ;
157
- let PTSFrag ;
160
+ // loop through overlapping SN and update startPTS, cc, and duration if any found
161
+ let PTSFrag : Fragment | undefined ;
158
162
mapFragmentIntersection (
159
163
oldDetails ,
160
164
newDetails ,
161
- ( oldFrag : Fragment , newFrag : Fragment ) => {
162
- if ( oldFrag . relurl ) {
163
- // Do not compare CC if the old fragment has no url. This is a level.fragmentHint used by LL-HLS parts.
164
- // It maybe be off by 1 if it was created before any parts or discontinuity tags were appended to the end
165
- // of the playlist.
166
- ccOffset = oldFrag . cc - newFrag . cc ;
165
+ ( oldFrag , newFrag , newFragIndex , newFragments ) => {
166
+ if ( newDetails . skippedSegments ) {
167
+ if ( newFrag . cc !== oldFrag . cc ) {
168
+ const ccOffset = oldFrag . cc - newFrag . cc ;
169
+ for ( let i = newFragIndex ; i < newFragments . length ; i ++ ) {
170
+ newFragments [ i ] . cc += ccOffset ;
171
+ }
172
+ }
167
173
}
168
174
if (
169
175
Number . isFinite ( oldFrag . startPTS ) &&
@@ -196,10 +202,11 @@ export function mergeDetails(
196
202
} ,
197
203
) ;
198
204
205
+ const newFragments = newDetails . fragments ;
199
206
if ( currentInitSegment ) {
200
207
const fragmentsToCheck = newDetails . fragmentHint
201
- ? newDetails . fragments . concat ( newDetails . fragmentHint )
202
- : newDetails . fragments ;
208
+ ? newFragments . concat ( newDetails . fragmentHint )
209
+ : newFragments ;
203
210
fragmentsToCheck . forEach ( ( frag ) => {
204
211
if (
205
212
frag &&
@@ -212,34 +219,26 @@ export function mergeDetails(
212
219
}
213
220
214
221
if ( newDetails . skippedSegments ) {
215
- newDetails . deltaUpdateFailed = newDetails . fragments . some ( ( frag ) => ! frag ) ;
222
+ newDetails . deltaUpdateFailed = newFragments . some ( ( frag ) => ! frag ) ;
216
223
if ( newDetails . deltaUpdateFailed ) {
217
224
logger . warn (
218
225
'[level-helper] Previous playlist missing segments skipped in delta playlist' ,
219
226
) ;
220
227
for ( let i = newDetails . skippedSegments ; i -- ; ) {
221
- newDetails . fragments . shift ( ) ;
228
+ newFragments . shift ( ) ;
229
+ }
230
+ newDetails . startSN = newFragments [ 0 ] . sn as number ;
231
+ } else {
232
+ if ( newDetails . canSkipDateRanges ) {
233
+ newDetails . dateRanges = mergeDateRanges (
234
+ oldDetails . dateRanges ,
235
+ newDetails . dateRanges ,
236
+ newDetails . recentlyRemovedDateranges ,
237
+ ) ;
222
238
}
223
- newDetails . startSN = newDetails . fragments [ 0 ] . sn as number ;
224
- newDetails . startCC = newDetails . fragments [ 0 ] . cc ;
225
- } else if ( newDetails . canSkipDateRanges ) {
226
- newDetails . dateRanges = mergeDateRanges (
227
- oldDetails . dateRanges ,
228
- newDetails . dateRanges ,
229
- newDetails . recentlyRemovedDateranges ,
230
- ) ;
231
- }
232
- }
233
-
234
- const newFragments = newDetails . fragments ;
235
- if ( ccOffset ) {
236
- logger . warn ( 'discontinuity sliding from playlist, take drift into account' ) ;
237
- for ( let i = 0 ; i < newFragments . length ; i ++ ) {
238
- newFragments [ i ] . cc += ccOffset ;
239
239
}
240
- }
241
- if ( newDetails . skippedSegments ) {
242
240
newDetails . startCC = newDetails . fragments [ 0 ] . cc ;
241
+ newDetails . endCC = newFragments [ newFragments . length - 1 ] . cc ;
243
242
}
244
243
245
244
// Merge parts
@@ -257,10 +256,10 @@ export function mergeDetails(
257
256
updateFragPTSDTS (
258
257
newDetails ,
259
258
PTSFrag ,
260
- PTSFrag . startPTS ,
261
- PTSFrag . endPTS ,
262
- PTSFrag . startDTS ,
263
- PTSFrag . endDTS ,
259
+ PTSFrag . startPTS as number ,
260
+ PTSFrag . endPTS as number ,
261
+ PTSFrag . startDTS as number ,
262
+ PTSFrag . endDTS as number ,
264
263
) ;
265
264
} else {
266
265
// ensure that delta is within oldFragments range
@@ -371,7 +370,7 @@ export function mapFragmentIntersection(
371
370
newFrag = newDetails . fragments [ i ] = oldFrag ;
372
371
}
373
372
if ( oldFrag && newFrag ) {
374
- intersectionFn ( oldFrag , newFrag ) ;
373
+ intersectionFn ( oldFrag , newFrag , i , newFrags ) ;
375
374
}
376
375
}
377
376
}
0 commit comments