From 2d65a184214a220184d8662f8e19dd9b3fde83f4 Mon Sep 17 00:00:00 2001 From: Alvaro Velad Galvan Date: Wed, 14 Sep 2022 19:37:12 +0200 Subject: [PATCH] fix: allow the playback on platforms when low latency APIs are not supported --- lib/media/streaming_engine.js | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/media/streaming_engine.js b/lib/media/streaming_engine.js index 3bee682a6a..0f918fac18 100644 --- a/lib/media/streaming_engine.js +++ b/lib/media/streaming_engine.js @@ -1240,7 +1240,13 @@ shaka.media.StreamingEngine = class { if (this.config_.lowLatencyMode && isReadableStreamSupported && isMP4 && !reference.hlsAes128Key) { let remaining = new Uint8Array(0); + let processingResult = false; + let callbackCalled = false; const streamDataCallback = async (data) => { + if (processingResult) { + return; + } + callbackCalled = true; this.destroyer_.ensureNotDestroyed(); if (this.fatalError_) { return; @@ -1271,7 +1277,30 @@ shaka.media.StreamingEngine = class { } }; - await this.fetch_(mediaState, reference, streamDataCallback); + const result = + await this.fetch_(mediaState, reference, streamDataCallback); + if (!callbackCalled) { + processingResult = true; + this.destroyer_.ensureNotDestroyed(); + if (this.fatalError_) { + return; + } + + // If the text stream gets switched between fetch_() and append_(), + // the new text parser is initialized, but the new init segment is + // not fetched yet. That would cause an error in + // TextParser.parseMedia(). + // See http://b/168253400 + if (mediaState.waitingToClearBuffer) { + shaka.log.info(logPrefix, 'waitingToClearBuffer, skip append'); + mediaState.performingUpdate = false; + this.scheduleUpdate_(mediaState, 0); + return; + } + + await this.append_( + mediaState, presentationTime, stream, reference, result); + } } else { if (this.config_.lowLatencyMode && !isReadableStreamSupported) { shaka.log.warning('Low latency streaming mode is enabled, but ' +