hls.js 1.6.0-beta.2.0.canary.10882 → 1.6.0-beta.2.0.canary.10884

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,12 @@ import type { Fragment, MediaFragment, Part } from '../loader/fragment';
9
9
  import type { LevelDetails } from '../loader/level-details';
10
10
  import type { Level } from '../types/level';
11
11
 
12
- type FragmentIntersection = (oldFrag: Fragment, newFrag: Fragment) => void;
12
+ type FragmentIntersection = (
13
+ oldFrag: MediaFragment,
14
+ newFrag: MediaFragment,
15
+ newFragIndex: number,
16
+ newFragments: MediaFragment[],
17
+ ) => void;
13
18
  type PartIntersection = (oldPart: Part, newPart: Part) => void;
14
19
 
15
20
  export function updatePTS(
@@ -107,7 +112,7 @@ export function updateFragPTSDTS(
107
112
  if (!details || sn < details.startSN || sn > details.endSN) {
108
113
  return 0;
109
114
  }
110
- let i;
115
+ let i: number;
111
116
  const fragIdx = sn - details.startSN;
112
117
  const fragments = details.fragments;
113
118
  // update frag reference in fragments array
@@ -156,18 +161,19 @@ export function mergeDetails(
156
161
  delete oldDetails.fragmentHint.endPTS;
157
162
  }
158
163
  // check if old/new playlists have fragments in common
159
- // loop through overlapping SN and update startPTS , cc, and duration if any found
160
- let ccOffset = 0;
161
- let PTSFrag;
164
+ // loop through overlapping SN and update startPTS, cc, and duration if any found
165
+ let PTSFrag: MediaFragment | undefined;
162
166
  mapFragmentIntersection(
163
167
  oldDetails,
164
168
  newDetails,
165
- (oldFrag: Fragment, newFrag: Fragment) => {
166
- if (oldFrag.relurl) {
167
- // Do not compare CC if the old fragment has no url. This is a level.fragmentHint used by LL-HLS parts.
168
- // It maybe be off by 1 if it was created before any parts or discontinuity tags were appended to the end
169
- // of the playlist.
170
- ccOffset = oldFrag.cc - newFrag.cc;
169
+ (oldFrag, newFrag, newFragIndex, newFragments) => {
170
+ if (newDetails.skippedSegments) {
171
+ if (newFrag.cc !== oldFrag.cc) {
172
+ const ccOffset = oldFrag.cc - newFrag.cc;
173
+ for (let i = newFragIndex; i < newFragments.length; i++) {
174
+ newFragments[i].cc += ccOffset;
175
+ }
176
+ }
171
177
  }
172
178
  if (
173
179
  Number.isFinite(oldFrag.startPTS) &&
@@ -207,9 +213,10 @@ export function mergeDetails(
207
213
  },
208
214
  );
209
215
 
216
+ const newFragments = newDetails.fragments;
210
217
  const fragmentsToCheck = newDetails.fragmentHint
211
- ? newDetails.fragments.concat(newDetails.fragmentHint)
212
- : newDetails.fragments;
218
+ ? newFragments.concat(newDetails.fragmentHint)
219
+ : newFragments;
213
220
  if (currentInitSegment) {
214
221
  fragmentsToCheck.forEach((frag) => {
215
222
  if (
@@ -223,19 +230,17 @@ export function mergeDetails(
223
230
  }
224
231
 
225
232
  if (newDetails.skippedSegments) {
226
- newDetails.deltaUpdateFailed = newDetails.fragments.some((frag) => !frag);
233
+ newDetails.deltaUpdateFailed = newFragments.some((frag) => !frag);
227
234
  if (newDetails.deltaUpdateFailed) {
228
235
  logger.warn(
229
236
  '[level-helper] Previous playlist missing segments skipped in delta playlist',
230
237
  );
231
238
  for (let i = newDetails.skippedSegments; i--; ) {
232
- newDetails.fragments.shift();
233
- }
234
- newDetails.startSN = newDetails.fragments[0].sn;
235
- if (!newDetails.startCC) {
236
- newDetails.startCC = newDetails.fragments[0].cc;
239
+ newFragments.shift();
237
240
  }
241
+ newDetails.startSN = newFragments[0].sn;
238
242
  } else {
243
+ newDetails.endCC = newFragments[newFragments.length - 1].cc;
239
244
  if (newDetails.canSkipDateRanges) {
240
245
  newDetails.dateRanges = mergeDateRanges(
241
246
  oldDetails.dateRanges,
@@ -260,17 +265,6 @@ export function mergeDetails(
260
265
  }
261
266
  }
262
267
 
263
- const newFragments = newDetails.fragments;
264
- if (ccOffset) {
265
- logger.warn('discontinuity sliding from playlist, take drift into account');
266
- for (let i = 0; i < newFragments.length; i++) {
267
- newFragments[i].cc += ccOffset;
268
- }
269
- }
270
- if (newDetails.skippedSegments) {
271
- newDetails.startCC = newDetails.fragments[0].cc;
272
- }
273
-
274
268
  // Merge parts
275
269
  mapPartIntersection(
276
270
  oldDetails.partList,
@@ -286,10 +280,10 @@ export function mergeDetails(
286
280
  updateFragPTSDTS(
287
281
  newDetails,
288
282
  PTSFrag,
289
- PTSFrag.startPTS,
290
- PTSFrag.endPTS,
291
- PTSFrag.startDTS,
292
- PTSFrag.endDTS,
283
+ PTSFrag.startPTS as number,
284
+ PTSFrag.endPTS as number,
285
+ PTSFrag.startDTS as number,
286
+ PTSFrag.endDTS as number,
293
287
  );
294
288
  } else {
295
289
  // ensure that delta is within oldFragments range
@@ -414,7 +408,7 @@ export function mapFragmentIntersection(
414
408
  newFrag = newDetails.fragments[i] = oldFrag;
415
409
  }
416
410
  if (oldFrag && newFrag) {
417
- intersectionFn(oldFrag, newFrag);
411
+ intersectionFn(oldFrag, newFrag, i, newFrags);
418
412
  }
419
413
  }
420
414
  }