From b313b01f45c8642bd364b93b50512246eecbe6bd Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 10 Apr 2021 10:51:08 +0200 Subject: [PATCH 1/3] Fetch-Loader.loadProgressively: Return Promise instead of cloning response --- src/utils/fetch-loader.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/utils/fetch-loader.ts b/src/utils/fetch-loader.ts index f4a1be3300f..3e7689dd319 100644 --- a/src/utils/fetch-loader.ts +++ b/src/utils/fetch-loader.ts @@ -110,7 +110,7 @@ class FetchLoader implements Loader { stats.total = parseInt(response.headers.get('Content-Length') || '0'); if (onProgress && Number.isFinite(config.highWaterMark)) { - this.loadProgressively( + return this.loadProgressively( response, stats, context, @@ -175,19 +175,20 @@ class FetchLoader implements Loader { context: LoaderContext, highWaterMark: number = 0, onProgress: LoaderOnProgress - ) { + ): Promise { const chunkCache = new ChunkCache(); - const reader = (response.clone().body as ReadableStream).getReader(); + const reader = (response.body as ReadableStream).getReader(); - const pump = () => { - reader + const pump = (): Promise => { + return reader .read() .then((data) => { if (data.done) { if (chunkCache.dataLength) { onProgress(stats, context, chunkCache.flush(), response); } - return; + + return Promise.resolve(new ArrayBuffer(0)); } const chunk: Uint8Array = data.value; const len = chunk.length; @@ -205,14 +206,15 @@ class FetchLoader implements Loader { // just emit the progress event onProgress(stats, context, chunk, response); } - pump(); + return pump(); }) .catch(() => { /* aborted */ + return Promise.reject(); }); }; - pump(); + return pump(); } } From 96fb735d262aa73ad16196103d2e510420cc2ef7 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 10 Apr 2021 10:52:18 +0200 Subject: [PATCH 2/3] TsDemuxer: extractRemainingSamples only when flush is true --- src/demux/tsdemuxer.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/demux/tsdemuxer.ts b/src/demux/tsdemuxer.ts index 44e9ceb64f7..a382143a2fc 100644 --- a/src/demux/tsdemuxer.ts +++ b/src/demux/tsdemuxer.ts @@ -409,7 +409,11 @@ class TSDemuxer implements Demuxer { id3Track, textTrack: this._txtTrack, }; - this.extractRemainingSamples(demuxResult); + + if (flush) { + this.extractRemainingSamples(demuxResult); + } + return demuxResult; } From 140400991372293dff124b61c241b445a0f54c33 Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 13 Apr 2021 12:23:40 +0200 Subject: [PATCH 3/3] Set flush param for Demuxer.demux depending on progressive mode config --- src/demux/transmuxer.ts | 7 ++++++- src/demux/tsdemuxer.ts | 7 ++++++- src/types/demuxer.ts | 3 ++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/demux/transmuxer.ts b/src/demux/transmuxer.ts index 5b37e99942f..89a48e0f18e 100644 --- a/src/demux/transmuxer.ts +++ b/src/demux/transmuxer.ts @@ -347,7 +347,12 @@ export default class Transmuxer { chunkMeta: ChunkMetadata ): TransmuxerResult { const { audioTrack, avcTrack, id3Track, textTrack } = (this - .demuxer as Demuxer).demux(data, timeOffset, false); + .demuxer as Demuxer).demux( + data, + timeOffset, + false, + !this.config.progressive + ); const remuxResult = this.remuxer!.remux( audioTrack, avcTrack, diff --git a/src/demux/tsdemuxer.ts b/src/demux/tsdemuxer.ts index a382143a2fc..fe7e071ebe6 100644 --- a/src/demux/tsdemuxer.ts +++ b/src/demux/tsdemuxer.ts @@ -486,7 +486,12 @@ class TSDemuxer implements Demuxer { keyData: KeyData, timeOffset: number ): Promise { - const demuxResult = this.demux(data, timeOffset, true); + const demuxResult = this.demux( + data, + timeOffset, + true, + !this.config.progressive + ); const sampleAes = (this.sampleAes = new SampleAesDecrypter( this.observer, this.config, diff --git a/src/types/demuxer.ts b/src/types/demuxer.ts index f398b3e06d0..505d2fe42f7 100644 --- a/src/types/demuxer.ts +++ b/src/types/demuxer.ts @@ -2,7 +2,8 @@ export interface Demuxer { demux( data: Uint8Array, timeOffset: number, - isSampleAes?: boolean + isSampleAes?: boolean, + flush?: boolean ): DemuxerResult; demuxSampleAes( data: Uint8Array,