Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Patch/v1.4.14 doris #87

Closed
wants to merge 146 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
0d7db5b
reference v1 jsdelivr url in v1 api doc
tjenkinson Apr 12, 2023
aacecab
chore(deps): update dependency @rollup/plugin-alias to v4.0.4
renovate[bot] Apr 12, 2023
df4f46a
Merge pull request #5382 from video-dev/renovate/rollup-plugin-alias-4.x
hlsjs-ci Apr 12, 2023
be37eb8
chore(deps): update dependency @microsoft/api-documenter to v7.21.7
renovate[bot] Apr 12, 2023
cde8f56
Merge pull request #5386 from video-dev/renovate/microsoft-api-docume…
hlsjs-ci Apr 12, 2023
80070b4
chore(deps): update dependency @rollup/plugin-typescript to v11.1.0
renovate[bot] Apr 12, 2023
83d0c6f
Merge pull request #5384 from video-dev/renovate/rollup-plugin-typesc…
hlsjs-ci Apr 12, 2023
abad27c
chore(deps): update dependency @rollup/plugin-node-resolve to v15.0.2
renovate[bot] Apr 12, 2023
b1ba59c
Merge pull request #5383 from video-dev/renovate/rollup-plugin-node-r…
hlsjs-ci Apr 12, 2023
3bd4336
chore(deps): update dependency wrangler to v2.15.0
renovate[bot] Apr 12, 2023
c7ce6b6
Merge pull request #5388 from video-dev/renovate/wrangler-2.x
hlsjs-ci Apr 12, 2023
eb6c74f
chore(deps): update dependency @rollup/plugin-alias to v5
renovate[bot] Apr 12, 2023
c176f5a
Merge pull request #5385 from video-dev/renovate/rollup-plugin-alias-5.x
tjenkinson Apr 12, 2023
8c528d3
Fix readme logos & add Mux logo (#5390)
luwes Apr 12, 2023
c6ef93a
chore(deps): update dependency lint-staged to v13.2.1
renovate[bot] Apr 14, 2023
b0e88cf
Merge pull request #5394 from video-dev/renovate/lint-staged-13.x
hlsjs-ci Apr 14, 2023
9432d5f
chore(deps): update dependency typescript to v5.0.4
renovate[bot] Apr 14, 2023
e2cd057
Merge pull request #5395 from video-dev/renovate/typescript-5.x
hlsjs-ci Apr 15, 2023
7b39d16
chore(deps): update dependency eslint to v8.38.0
renovate[bot] Apr 15, 2023
54707a9
Merge pull request #5396 from video-dev/renovate/eslint-8.x
hlsjs-ci Apr 15, 2023
baf16ed
chore(deps): update dependency es-check to v7.1.1
renovate[bot] Apr 16, 2023
9501245
Merge pull request #5397 from video-dev/renovate/es-check-7.x
hlsjs-ci Apr 16, 2023
7773229
chore(deps): update dependency @rollup/plugin-terser to v0.4.1
renovate[bot] Apr 16, 2023
7782205
Merge pull request #5398 from video-dev/renovate/rollup-plugin-terser…
hlsjs-ci Apr 17, 2023
c4aa95f
chore(deps): update typescript-eslint monorepo to v5.58.0
renovate[bot] Apr 17, 2023
b2e4460
Merge pull request #5399 from video-dev/renovate/typescript-eslint-mo…
hlsjs-ci Apr 17, 2023
507a316
chore(deps): update dependency semver to v7.4.0
renovate[bot] Apr 17, 2023
3dc48f5
Merge pull request #5400 from video-dev/renovate/semver-7.x
hlsjs-ci Apr 18, 2023
6f7deea
chore(deps): update dependency @rollup/plugin-commonjs to v24.1.0
renovate[bot] Apr 18, 2023
4aecfeb
Merge pull request #5401 from video-dev/renovate/rollup-plugin-common…
hlsjs-ci Apr 19, 2023
4398ba2
chore(deps): update dependency semver to v7.5.0
renovate[bot] Apr 19, 2023
e5eca3d
Merge pull request #5404 from video-dev/renovate/semver-7.x
hlsjs-ci Apr 20, 2023
17a8737
chore(deps): update typescript-eslint monorepo to v5.59.0
renovate[bot] Apr 20, 2023
ebd7993
Merge pull request #5405 from video-dev/renovate/typescript-eslint-mo…
hlsjs-ci Apr 20, 2023
a9afcd5
Setup npm provenance statements (#5406)
tjenkinson Apr 20, 2023
ca60d2c
chore(deps): update dependency chromedriver to v112 (#5393)
renovate[bot] Apr 20, 2023
f5c74a4
set `internalChecksAsSuccess` renovate option
tjenkinson Apr 21, 2023
c0a0063
chore(deps): update dependency wrangler to v2.15.1
renovate[bot] Apr 21, 2023
70dbfbe
Merge pull request #5408 from video-dev/renovate/wrangler-2.x
hlsjs-ci Apr 21, 2023
3982190
set renovate `prNotPendingHours` to 0
tjenkinson Apr 21, 2023
be549a8
chore(deps): update dependency wrangler to v2.16.0
renovate[bot] Apr 21, 2023
e741ee3
Merge pull request #5411 from video-dev/renovate/wrangler-2.x
hlsjs-ci Apr 22, 2023
7f98e45
chore(deps): update dependency rollup to v3.20.3
renovate[bot] Apr 23, 2023
21cb856
Merge pull request #5414 from video-dev/renovate/rollup-3.x
hlsjs-ci Apr 23, 2023
8fbdae6
chore(deps): update dependency rollup to v3.20.7
renovate[bot] Apr 23, 2023
48a0e97
Merge pull request #5415 from video-dev/renovate/rollup-3.x
hlsjs-ci Apr 23, 2023
b774318
chore(deps): update dependency rollup to v3.21.0
renovate[bot] Apr 23, 2023
666780e
Merge pull request #5416 from video-dev/renovate/rollup-3.x
hlsjs-ci Apr 24, 2023
0e14626
chore(deps): update tjenkinson/gh-action-auto-merge-dependency-update…
renovate[bot] Apr 24, 2023
569054a
tweak renovate options again
tjenkinson Apr 24, 2023
0b1e939
reset remainderData in resetContiguity (#5410)
WilliamChiu Apr 24, 2023
7802cfc
docs: add Media Chrome for custom UI (#5391)
luwes Apr 26, 2023
77ced53
Perform playlist retries before redundant failover and level switch (…
robwalch Apr 26, 2023
0fb288d
chore(deps): update dependency sinon to v15.0.4
renovate[bot] Apr 27, 2023
badbaa1
Merge pull request #5427 from video-dev/renovate/sinon-15.x
hlsjs-ci Apr 27, 2023
1181cfa
chore(deps): update dependency karma-chrome-launcher to v3.2.0
renovate[bot] Apr 27, 2023
07cca66
Merge pull request #5428 from video-dev/renovate/karma-chrome-launche…
hlsjs-ci Apr 27, 2023
c8e95b6
chore(deps): update dependency selenium-webdriver to v4.9.0
renovate[bot] Apr 28, 2023
163442d
Merge pull request #5429 from video-dev/renovate/selenium-webdriver-4.x
hlsjs-ci Apr 28, 2023
8d142ec
Update audio-track-controller.ts (#5431)
agajassi Apr 28, 2023
3c615c1
chore(deps): update dependency eslint to v8.39.0
renovate[bot] Apr 28, 2023
2d26c77
Merge pull request #5434 from video-dev/renovate/eslint-8.x
hlsjs-ci Apr 28, 2023
ef60b22
chore(deps): update dependency karma to v6.4.2
renovate[bot] Apr 28, 2023
2c2e0e9
Merge pull request #5435 from video-dev/renovate/karma-6.x
hlsjs-ci Apr 29, 2023
10b5f73
chore(deps): update dependency prettier to v2.8.8
renovate[bot] Apr 30, 2023
69e9c1d
Merge pull request #5437 from video-dev/renovate/prettier-2.x
hlsjs-ci Apr 30, 2023
1dd74bb
Fix incorrect HEVC main profile codec id (#5438)
StaZhu May 1, 2023
9082342
fix: move `types` condition to the front (#5439)
Andarist May 1, 2023
1c30a1f
chore(deps): update dependency wrangler to v2.17.0
renovate[bot] May 1, 2023
d7c4ec9
Merge pull request #5441 from video-dev/renovate/wrangler-2.x
hlsjs-ci May 1, 2023
b26542f
chore(deps): update typescript-eslint monorepo to v5.59.1
renovate[bot] May 1, 2023
e70c3aa
Merge pull request #5442 from video-dev/renovate/typescript-eslint-mo…
hlsjs-ci May 1, 2023
31b0b04
chore(deps): update typescript-eslint monorepo to v5.59.2
renovate[bot] May 1, 2023
89ca104
Merge pull request #5443 from video-dev/renovate/typescript-eslint-mo…
hlsjs-ci May 1, 2023
f4629d3
Fix Low-Latency part and fragment tracking (#5423)
robwalch May 3, 2023
4c5bc20
chore(deps): update dependency lint-staged to v13.2.2
renovate[bot] May 3, 2023
4aec275
Merge pull request #5449 from video-dev/renovate/lint-staged-13.x
hlsjs-ci May 3, 2023
2105ade
Always use MediaSource returned by utils module (#5448)
robwalch May 3, 2023
d18b676
chore(deps): update dependency @microsoft/api-documenter to v7.22.0
renovate[bot] May 4, 2023
bb5072e
Merge pull request #5453 from video-dev/renovate/microsoft-api-docume…
hlsjs-ci May 4, 2023
36bc6b9
chore(deps): update dependency @microsoft/api-documenter to v7.22.4
renovate[bot] May 4, 2023
b0a72ff
Merge pull request #5454 from video-dev/renovate/microsoft-api-docume…
hlsjs-ci May 4, 2023
b6d49f2
chore(deps): update babel monorepo to v7.21.5
renovate[bot] May 5, 2023
64db092
Merge pull request #5462 from video-dev/renovate/babel-monorepo
hlsjs-ci May 5, 2023
d28d590
chore(deps): update dependency @microsoft/api-extractor to v7.34.5
renovate[bot] May 5, 2023
90c1659
Merge pull request #5458 from video-dev/renovate/microsoft-api-extrac…
hlsjs-ci May 5, 2023
ddab001
chore(deps): update dependency @babel/core to v7.21.8
renovate[bot] May 5, 2023
dcf4024
Merge pull request #5463 from video-dev/renovate/babel-monorepo
hlsjs-ci May 6, 2023
c591fb7
chore(deps): update dependency @microsoft/api-extractor to v7.34.6
renovate[bot] May 6, 2023
7fa4bbf
Merge pull request #5464 from video-dev/renovate/microsoft-api-extrac…
hlsjs-ci May 6, 2023
bcbdbbf
chore(deps): update dependency @microsoft/api-extractor to v7.34.8
renovate[bot] May 6, 2023
8838613
Merge pull request #5465 from video-dev/renovate/microsoft-api-extrac…
hlsjs-ci May 6, 2023
d5dbe60
chore(deps): update dependency @types/chai to v4.3.5
renovate[bot] May 6, 2023
f6e4693
Merge pull request #5466 from video-dev/renovate/chai-4.x
hlsjs-ci May 6, 2023
67cd7b6
chore(deps): update dependency rollup to v3.21.1
renovate[bot] May 6, 2023
8fe2639
Merge pull request #5467 from video-dev/renovate/rollup-3.x
hlsjs-ci May 6, 2023
8637280
chore(deps): update dependency rollup to v3.21.5
renovate[bot] May 6, 2023
df1cc11
Merge pull request #5468 from video-dev/renovate/rollup-3.x
hlsjs-ci May 6, 2023
8f11b06
chore(deps): update dependency eventemitter3 to v5.0.1
renovate[bot] May 7, 2023
6ae60ad
Merge pull request #5470 from video-dev/renovate/eventemitter3-5.x
hlsjs-ci May 7, 2023
ef718d2
fix: partial audiovideo fragments not being treated as partial (#5460)
TroyKomodo May 8, 2023
9ed55f1
Fix AV desync regression in v1.4.0 when mp4 audio track timestamps st…
robwalch May 9, 2023
d32731e
chore(deps): update dependency wrangler to v2.18.0
renovate[bot] May 9, 2023
54f745f
Merge pull request #5472 from video-dev/renovate/wrangler-2.x
hlsjs-ci May 9, 2023
f22f296
chore(deps): update dependency chromedriver to v112.0.1
renovate[bot] May 9, 2023
989091c
Merge pull request #5474 from video-dev/renovate/chromedriver-112.x
hlsjs-ci May 9, 2023
0f7b5e0
chore(deps): update dependency wrangler to v2.20.0
renovate[bot] May 9, 2023
680947f
Merge pull request #5475 from video-dev/renovate/wrangler-2.x
hlsjs-ci May 9, 2023
fc5e295
Allow live level loading to recover from net::ERR_NETWORK_IO_SUSPENDE…
robwalch May 9, 2023
8befacd
Remove startLoad() as recovery method from API.md doc (#5478)
robwalch May 10, 2023
093a41c
Fix first fragment ejection tracking (#5480)
robwalch May 11, 2023
a58ce98
Provide light ESM dist file (#5486)
Chocobozzz May 16, 2023
ca3a288
Playlist loading errors are fatal after all levels and retries exhaus…
robwalch May 24, 2023
93dae54
Adjust parsed TS AVC samples when start PTS overlaps with last DTS (#…
robwalch May 25, 2023
3152e97
Fix TS probing false positives by requiring 2-3 packet start bytes to…
robwalch May 25, 2023
15d9ef3
Use input timescale when normalizing metadata cue timestamps (#5505)
robwalch May 25, 2023
f670acc
Resume fragment loading after level switch follows level error
robwalch Jun 2, 2023
a41088c
Do not adjust the end time of metadata cues that overlap with cues of…
robwalch Jun 5, 2023
4be1e13
Keep level switch error actions within player constraints
robwalch Jun 15, 2023
bfa3cb6
Merge pull request #5570 from video-dev/bugfix/patch-switch-on-error-…
robwalch Jun 15, 2023
206eb23
Fix issue where large subtitle target-durations result in incorrect s…
robwalch Jun 24, 2023
0680289
Reset loader aborted state on internal retry
robwalch Jun 24, 2023
b983a9a
Wait for level switch after fragment or key error with level switch a…
robwalch Jun 24, 2023
30757b1
Merge pull request #5598 from video-dev/bugfix/xhr-retries-aborted
robwalch Jun 27, 2023
a567ef5
Remove requirement for subtitles to be synced with media PTS when Web…
robwalch Jun 27, 2023
11d9097
Only load earlier subtitle fragment if discontinuity matches
robwalch Jun 28, 2023
7002632
Merge pull request #5597 from video-dev/bugfix/subtitle-target-durati…
robwalch Jun 28, 2023
8c099ae
Never back-track on first fragment to avoid loop loading
robwalch Jun 30, 2023
94cd133
Reset loading start on worker setup error
robwalch Jul 3, 2023
ead838a
Fix issue #5632, where missing AUD units for keyframes causes them to…
Thulinma Jul 14, 2023
32eac50
Fix handling of segments at the discontinuities that do not start wit…
robwalch Jul 14, 2023
d0e6702
Do not perform backtrack flushing before first segment of discontinuity
robwalch Jul 14, 2023
1dd623c
Use input timescale when remuxing inband captions (#5675)
robwalch Jul 18, 2023
7cde71f
Allow the odd empty segment to be skipped like a gap segment (#5676)
robwalch Jul 18, 2023
9dfe464
Merge bugfix/live-append-only-endlist into patch v1.4.x branch (#5785)
semarche-kaltura Aug 31, 2023
62e2db2
Fix support of skip directive without block reload (Regressed in #5317)
robwalch Aug 31, 2023
f29943e
Add polyfill for isSafeInteger
robwalch Dec 6, 2023
02e53c7
Remove use of deprecated WebKitDataCue and hand Cue instantiation and…
robwalch Dec 6, 2023
8f275af
Merge pull request #6023 from video-dev/bugfix/cherry-pick-fixes-1_4_13
robwalch Dec 7, 2023
913a26e
Fix ID3 Decoding On PlayStation 4 (#6048)
agajassi Dec 18, 2023
57c07b5
Patch/v1.4.0 doris (#79)
yajin2021 May 5, 2023
ef5c929
Patch/v1.4.1 doris (#80)
hongfeih-es May 6, 2023
c42242a
Update DiceTechnology/hls.js to v1.4.3(#81)
yajin2021 May 6, 2023
bdab516
Patch/v1.4.4 doris (#82)
yajin2021 May 26, 2023
5b6ea63
Merge branch 'patch/v1.4.x-doris' into patch/v1.4.14-doris
eowino Jan 16, 2024
2b0b9cd
1.4.14
eowino Jan 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion api-extractor/report/hls.js.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,9 @@ export class BaseStreamController extends TaskLoop implements NetworkComponentAP
// Warning: (ae-forgotten-export) The symbol "RemuxedTrack" needs to be exported by the entry point hls.d.ts
//
// (undocumented)
protected bufferFragmentData(data: RemuxedTrack, frag: Fragment, part: Part | null, chunkMeta: ChunkMetadata): void;
protected bufferFragmentData(data: RemuxedTrack, frag: Fragment, part: Part | null, chunkMeta: ChunkMetadata, noBacktracking?: boolean): void;
// (undocumented)
protected checkLiveUpdate(details: LevelDetails): void;
// (undocumented)
protected clearTrackerIfNeeded(frag: Fragment): void;
// (undocumented)
Expand Down
8 changes: 8 additions & 0 deletions build-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,14 @@ const babelTsWithPresetEnvTargets = ({ targets, stripConsole }) =>
'isFiniteNumber',
path.resolve('src/polyfills/number')
);
} else if (
espath.get('callee').matchesPattern('Number.isSafeInteger')
) {
espath.node.callee = importHelper.addNamed(
espath,
'isSafeInteger',
path.resolve('src/polyfills/number')
);
} else if (
espath.get('callee').matchesPattern('Number.MAX_SAFE_INTEGER')
) {
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hls.js",
"version": "1.4.5",
"version": "1.4.14",
"license": "Apache-2.0",
"description": "JavaScript HLS client using MediaSourceExtension",
"homepage": "https://github.com/video-dev/hls.js",
Expand Down
4 changes: 1 addition & 3 deletions src/controller/audio-stream-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -513,10 +513,8 @@ class AudioStreamController
const track = levels[trackId];
let sliding = 0;
if (newDetails.live || track.details?.live) {
this.checkLiveUpdate(newDetails);
const mainDetails = this.mainDetails;
if (!newDetails.fragments[0]) {
newDetails.deltaUpdateFailed = true;
}
if (newDetails.deltaUpdateFailed || !mainDetails) {
return;
}
Expand Down
4 changes: 3 additions & 1 deletion src/controller/base-playlist-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ export default class BasePlaylistController implements NetworkComponentAPI {
`live playlist ${index} ${
details.advanced
? 'REFRESHED ' + details.lastPartSn + '-' + details.lastPartIndex
: details.updated
? 'UPDATED'
: 'MISSED'
}`
);
Expand Down Expand Up @@ -224,7 +226,7 @@ export default class BasePlaylistController implements NetworkComponentAPI {
this.loadPlaylist(deliveryDirectives);
return;
}
} else if (details.canBlockReload) {
} else if (details.canBlockReload || details.canSkipUntil) {
deliveryDirectives = this.getDeliveryDirectives(
details,
data.deliveryDirectives,
Expand Down
46 changes: 39 additions & 7 deletions src/controller/base-stream-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,22 @@ export default class BaseStreamController
}
}

protected checkLiveUpdate(details: LevelDetails) {
if (details.updated && !details.live) {
// Live stream ended, update fragment tracker
const lastFragment = details.fragments[details.fragments.length - 1];
this.fragmentTracker.detectPartialFragments({
frag: lastFragment,
part: null,
stats: lastFragment.stats,
id: lastFragment.type,
});
}
if (!details.fragments[0]) {
details.deltaUpdateFailed = true;
}
}

protected flushMainBuffer(
startOffset: number,
endOffset: number,
Expand Down Expand Up @@ -884,7 +900,8 @@ export default class BaseStreamController
data: RemuxedTrack,
frag: Fragment,
part: Part | null,
chunkMeta: ChunkMetadata
chunkMeta: ChunkMetadata,
noBacktracking?: boolean
) {
if (!data || this.state !== State.PARSING) {
return;
Expand Down Expand Up @@ -912,6 +929,9 @@ export default class BaseStreamController
this.hls.trigger(Events.BUFFER_APPENDING, segment);

if (data.dropped && data.independent && !part) {
if (noBacktracking) {
return;
}
// Clear buffer so that we reload previous segments sequentially if required
this.flushBufferGap(frag);
}
Expand Down Expand Up @@ -1520,10 +1540,7 @@ export default class BaseStreamController
action === NetworkErrorAction.RetryRequest &&
retryConfig
) {
if (!this.loadedmetadata) {
this.startFragRequested = false;
this.nextLoadPosition = this.startPosition;
}
this.resetStartWhenNotLoaded(this.levelLastLoaded ?? frag.level);
const delay = getRetryDelay(retryConfig, retryCount);
this.warn(
`Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${
Expand All @@ -1547,6 +1564,10 @@ export default class BaseStreamController
`${data.details} reached or exceeded max retry (${retryCount})`
);
}
} else if (
errorAction?.action === NetworkErrorAction.SendAlternateToPenaltyBox
) {
this.state = State.WAITING_LEVEL;
} else {
this.state = State.ERROR;
}
Expand Down Expand Up @@ -1652,7 +1673,7 @@ export default class BaseStreamController
`The loading context changed while buffering fragment ${chunkMeta.sn} of level ${chunkMeta.level}. This chunk will not be buffered.`
);
this.removeUnbufferedFrags();
this.resetStartWhenNotLoaded(chunkMeta.level);
this.resetStartWhenNotLoaded(this.levelLastLoaded ?? chunkMeta.level);
this.resetLoadingState();
}

Expand Down Expand Up @@ -1720,8 +1741,15 @@ export default class BaseStreamController
level.fragmentError = 0;
} else if (this.transmuxer?.error === null) {
const error = new Error(
`Found no media in fragment ${frag.sn} of level ${level.id} resetting transmuxer to fallback to playlist timing`
`Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing`
);
if (level.fragmentError === 0) {
// Mark and track the odd empty segment as a gap to avoid reloading
level.fragmentError++;
frag.gap = true;
this.fragmentTracker.removeFragment(frag);
this.fragmentTracker.fragBuffered(frag, true);
}
this.warn(error.message);
this.hls.trigger(Events.ERROR, {
type: ErrorTypes.MEDIA_ERROR,
Expand Down Expand Up @@ -1750,7 +1778,11 @@ export default class BaseStreamController

protected recoverWorkerError(data: ErrorData) {
if (data.event === 'demuxerWorker') {
this.fragmentTracker.removeAllFragments();
this.resetTransmuxer();
this.resetStartWhenNotLoaded(
this.levelLastLoaded ?? this.fragCurrent?.level ?? 0
);
this.resetLoadingState();
}
}
Expand Down
19 changes: 15 additions & 4 deletions src/controller/error-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,17 @@ export default class ErrorController implements NetworkComponentAPI {
case ErrorDetails.KEY_LOAD_TIMEOUT:
data.errorAction = this.getFragRetryOrSwitchAction(data);
return;
case ErrorDetails.FRAG_GAP:
case ErrorDetails.FRAG_PARSING_ERROR:
// ignore empty segment errors marked as gap
if (data.frag?.gap) {
data.errorAction = {
action: NetworkErrorAction.DoNothing,
flags: ErrorActionFlags.None,
};
return;
}
// falls through
case ErrorDetails.FRAG_GAP:
case ErrorDetails.FRAG_DECRYPT_ERROR: {
// Switch level if possible, otherwise allow retry count to reach max error retries
data.errorAction = this.getFragRetryOrSwitchAction(data);
Expand Down Expand Up @@ -330,14 +339,16 @@ export default class ErrorController implements NetworkComponentAPI {
if (hls.autoLevelEnabled) {
// Search for next level to retry
let nextLevel = -1;
const levels = hls.levels;
const { levels, loadLevel, minAutoLevel, maxAutoLevel } = hls;
const fragErrorType = data.frag?.type;
const { type: playlistErrorType, groupId: playlistErrorGroupId } =
data.context ?? {};
for (let i = levels.length; i--; ) {
const candidate = (i + hls.loadLevel) % levels.length;
const candidate = (i + loadLevel) % levels.length;
if (
candidate !== hls.loadLevel &&
candidate !== loadLevel &&
candidate >= minAutoLevel &&
candidate <= maxAutoLevel &&
levels[candidate].loadError === 0
) {
const levelCandidate = levels[candidate];
Expand Down
6 changes: 4 additions & 2 deletions src/controller/fragment-tracker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ export class FragmentTracker implements ComponentAPI {

const fragKey = getFragmentKey(frag);
const fragmentEntity = this.fragments[fragKey];
if (!fragmentEntity) {
if (!fragmentEntity || (fragmentEntity.buffered && frag.gap)) {
return;
}
const isFragHint = !frag.relurl;
Expand All @@ -206,7 +206,9 @@ export class FragmentTracker implements ComponentAPI {
fragmentEntity.loaded = null;
if (Object.keys(fragmentEntity.range).length) {
fragmentEntity.buffered = true;
if (fragmentEntity.body.endList) {
const endList = (fragmentEntity.body.endList =
frag.endList || fragmentEntity.body.endList);
if (endList) {
this.endListFragments[fragmentEntity.body.type] = fragmentEntity;
}
if (!isPartial(fragmentEntity)) {
Expand Down
85 changes: 63 additions & 22 deletions src/controller/id3-track-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,13 @@ declare global {
}
}

type Cue = VTTCue | TextTrackCue;

const MIN_CUE_DURATION = 0.25;

const isPlayStation4 = () => {
return /PlayStation 4/i.test(navigator.userAgent);
};

function getCueClass() {
function getCueClass(): typeof VTTCue | typeof TextTrackCue | undefined {
if (typeof self === 'undefined') return undefined;

// Attempt to recreate Safari functionality by creating
Expand All @@ -47,12 +45,35 @@ function getCueClass() {
self.TextTrackCue) as any;
}

function createCueWithDataFields(
Cue: typeof VTTCue | typeof TextTrackCue,
startTime: number,
endTime: number,
data: Object,
type?: string
): VTTCue | TextTrackCue | undefined {
let cue = new Cue(startTime, endTime, '');
try {
(cue as any).value = data;
if (type) {
(cue as any).type = type;
}
} catch (e) {
cue = new Cue(
startTime,
endTime,
JSON.stringify(type ? { type, ...data } : data)
);
}
return cue;
}

// VTTCue latest draft allows an infinite duration, fallback
// to MAX_VALUE if necessary
const MAX_CUE_ENDTIME = (() => {
const Cue = getCueClass();
try {
new Cue(0, Number.POSITIVE_INFINITY, '');
Cue && new Cue(0, Number.POSITIVE_INFINITY, '');
} catch (e) {
return Number.MAX_VALUE;
}
Expand All @@ -78,7 +99,11 @@ class ID3TrackController implements ComponentAPI {
private media: HTMLMediaElement | null = null;
private dateRangeCuesAppended: Record<
string,
{ cues: Record<string, Cue>; dateRange: DateRange; durationKnown: boolean }
{
cues: Record<string, VTTCue | TextTrackCue>;
dateRange: DateRange;
durationKnown: boolean;
}
> = {};

constructor(hls) {
Expand Down Expand Up @@ -185,6 +210,9 @@ class ID3TrackController implements ComponentAPI {
}

const Cue = getCueClass();
if (!Cue) {
return;
}

for (let i = 0; i < samples.length; i++) {
const type = samples[i].type;
Expand Down Expand Up @@ -214,26 +242,33 @@ class ID3TrackController implements ComponentAPI {
// Safari doesn't put the timestamp frame in the TextTrack
if (!ID3.isTimeStampFrame(frame)) {
// add a bounds to any unbounded cues
this.updateId3CueEnds(startTime);

const cue = new Cue(startTime, endTime, '');
cue.value = frame;
if (type) {
cue.type = type;
this.updateId3CueEnds(startTime, type);
const cue = createCueWithDataFields(
Cue,
startTime,
endTime,
frame,
type
);
if (cue) {
this.id3Track.addCue(cue);
}
this.id3Track.addCue(cue);
}
}
}
}
}

updateId3CueEnds(startTime: number) {
updateId3CueEnds(startTime: number, type: MetadataSchema) {
const cues = this.id3Track?.cues;
if (cues) {
for (let i = cues.length; i--; ) {
const cue = cues[i] as any;
if (cue.startTime < startTime && cue.endTime === MAX_CUE_ENDTIME) {
if (
cue.type === type &&
cue.startTime < startTime &&
cue.endTime === MAX_CUE_ENDTIME
) {
cue.endTime = startTime;
}
}
Expand Down Expand Up @@ -354,22 +389,28 @@ class ID3TrackController implements ComponentAPI {
if (!isDateRangeCueAttribute(key)) {
continue;
}
let cue = cues[key] as any;
const cue = cues[key];
if (cue) {
if (durationKnown && !appendedDateRangeCues.durationKnown) {
cue.endTime = endTime;
}
} else {
} else if (Cue) {
let data = dateRange.attr[key];
cue = new Cue(startTime, endTime, '');
if (isSCTE35Attribute(key)) {
data = hexToArrayBuffer(data);
}
cue.value = { key, data };
cue.type = MetadataSchema.dateRange;
cue.id = id;
this.id3Track.addCue(cue);
cues[key] = cue;
const cue = createCueWithDataFields(
Cue,
startTime,
endTime,
{ key, data },
MetadataSchema.dateRange
);
if (cue) {
cue.id = id;
this.id3Track.addCue(cue);
cues[key] = cue;
}
}
}
dateRangeCuesAppended[id] = {
Expand Down
Loading
Loading