Skip to content

Commit 682444a

Browse files
committed
Fallback to inline demuxing on Worker error
#5015
1 parent 436ccf8 commit 682444a

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/demux/transmuxer-interface.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export default class TransmuxerInterface {
2424
private observer: HlsEventEmitter;
2525
private frag: Fragment | null = null;
2626
private part: Part | null = null;
27+
private useWorker: boolean;
2728
private worker: any;
2829
private onwmsg?: Function;
2930
private transmuxer: Transmuxer | null = null;
@@ -36,18 +37,18 @@ export default class TransmuxerInterface {
3637
onTransmuxComplete: (transmuxResult: TransmuxerResult) => void,
3738
onFlush: (chunkMeta: ChunkMetadata) => void
3839
) {
40+
const config = hls.config;
3941
this.hls = hls;
4042
this.id = id;
43+
this.useWorker = !!config.enableWorker;
4144
this.onTransmuxComplete = onTransmuxComplete;
4245
this.onFlush = onFlush;
4346

44-
const config = hls.config;
45-
4647
const forwardMessage = (ev, data) => {
4748
data = data || {};
4849
data.frag = this.frag;
4950
data.id = this.id;
50-
hls.trigger(ev, data);
51+
this.hls.trigger(ev, data);
5152
};
5253

5354
// forward events to main thread
@@ -63,7 +64,7 @@ export default class TransmuxerInterface {
6364
// navigator.vendor is not always available in Web Worker
6465
// refer to https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/navigator
6566
const vendor = navigator.vendor;
66-
if (config.enableWorker && typeof Worker !== 'undefined') {
67+
if (this.useWorker && typeof Worker !== 'undefined') {
6768
logger.log('demuxing in webworker');
6869
let worker;
6970
try {
@@ -73,10 +74,12 @@ export default class TransmuxerInterface {
7374
this.onwmsg = this.onWorkerMessage.bind(this);
7475
worker.addEventListener('message', this.onwmsg);
7576
worker.onerror = (event) => {
76-
hls.trigger(Events.ERROR, {
77+
this.useWorker = false;
78+
logger.warn('Exception in webworker, fallback to inline');
79+
this.hls.trigger(Events.ERROR, {
7780
type: ErrorTypes.OTHER_ERROR,
7881
details: ErrorDetails.INTERNAL_EXCEPTION,
79-
fatal: true,
82+
fatal: false,
8083
event: 'demuxerWorker',
8184
error: new Error(
8285
`${event.message} (${event.filename}:${event.lineno})`
@@ -159,6 +162,7 @@ export default class TransmuxerInterface {
159162
chunkMeta.transmuxing.start = self.performance.now();
160163
const { transmuxer, worker } = this;
161164
const timeOffset = part ? part.start : frag.start;
165+
// TODO: push "clear-lead" decrypt data for unencrypted fragments in streams with encrypted ones
162166
const decryptdata = frag.decryptdata;
163167
const lastFrag = this.frag;
164168

0 commit comments

Comments
 (0)