Skip to content

Commit cf11379

Browse files
committed
Clean up fragment preloader
1 parent 5fac14c commit cf11379

File tree

3 files changed

+60
-61
lines changed

3 files changed

+60
-61
lines changed

src/controller/base-stream-controller.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ import type { HlsConfig } from '../config';
5252
import type { NetworkComponentAPI } from '../types/component-api';
5353
import type { SourceBufferName } from '../types/buffer';
5454
import type { RationalTimestamp } from '../utils/timescale-conversion';
55-
import FragmentPreloader, {
56-
FragPreloadRequestState,
57-
} from '../loader/fragment-preloader';
55+
import FragmentPreloader from '../loader/fragment-preloader';
5856

5957
type ResolveFragLoaded = (FragLoadedEndData) => void;
6058
type RejectFragLoaded = (LoadError) => void;
@@ -822,7 +820,7 @@ export default class BaseStreamController
822820
this.hls.lowLatencyMode &&
823821
details?.live &&
824822
details.canBlockReload &&
825-
this.fragmentPreloader.state === FragPreloadRequestState.IDLE
823+
!this.fragmentPreloader.loading
826824
) {
827825
this.loadAndCachePreloadHint(details);
828826
}
@@ -868,8 +866,8 @@ export default class BaseStreamController
868866
}
869867
return this.getCachedRequestOrLoad(
870868
frag,
871-
null,
872-
true,
869+
/*part*/ undefined,
870+
/*dataOnProgress*/ true,
873871
progressCallback,
874872
);
875873
})
@@ -879,7 +877,7 @@ export default class BaseStreamController
879877
// or handle fragment result after key and fragment are finished loading
880878
const loadRequest = this.getCachedRequestOrLoad(
881879
frag,
882-
null,
880+
/*part*/ undefined,
883881
dataOnProgress,
884882
progressCallback,
885883
);
@@ -939,12 +937,12 @@ export default class BaseStreamController
939937

940938
private getCachedRequestOrLoad(
941939
frag: Fragment,
942-
part: Part | null,
940+
part: Part | undefined,
943941
dataOnProgress: boolean,
944942
progressCallback?: FragmentLoadProgressCallback,
945943
): Promise<FragLoadedData | PartsLoadedData> {
946944
const request = this.fragmentPreloader.getCachedRequest(frag, part);
947-
if (request !== null) {
945+
if (request !== undefined) {
948946
return request.then((data) => {
949947
if (progressCallback) {
950948
progressCallback(data);

src/controller/stream-controller.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import type {
3535
ManifestParsedData,
3636
MediaAttachedData,
3737
} from '../types/events';
38-
import { FragPreloadRequestState } from '../loader/fragment-preloader';
3938

4039
const TICK_INTERVAL = 100; // how often to tick in ms
4140

@@ -655,7 +654,7 @@ export default class StreamController
655654
if (newDetails.live || curLevel.details?.live) {
656655
this.checkLiveUpdate(newDetails);
657656
if (
658-
this.fragmentPreloader.state === FragPreloadRequestState.LOADING &&
657+
this.fragmentPreloader.loading &&
659658
this.fragmentPreloader.frag?.level !== data.level
660659
) {
661660
this.fragmentPreloader.abort();

src/loader/fragment-preloader.ts

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@ import {
1010
import { HlsConfig } from '../hls';
1111
import { logger } from '../utils/logger';
1212

13-
export const enum FragPreloadRequestState {
13+
export const enum FragRequestState {
1414
IDLE,
1515
LOADING,
1616
}
1717

1818
type FragPreloadRequest = {
1919
frag: Fragment;
20-
part: Part | null;
20+
part: Part | undefined;
2121
loadPromise: Promise<FragLoadedData>;
2222
};
2323

24-
type FragPreloadRequestInfo = {
25-
info: FragPreloadRequest | null;
26-
state: FragPreloadRequestState;
24+
type FragPreloaderStorage = {
25+
request: FragPreloadRequest | undefined;
26+
state: FragRequestState;
2727
};
2828

2929
export default class FragmentPreloader extends FragmentLoader {
30-
private storage: FragPreloadRequestInfo = {
31-
info: null,
32-
state: FragPreloadRequestState.IDLE,
30+
private storage: FragPreloaderStorage = {
31+
request: undefined,
32+
state: FragRequestState.IDLE,
3333
};
3434
protected log: (msg: any) => void;
3535

@@ -40,27 +40,32 @@ export default class FragmentPreloader extends FragmentLoader {
4040

4141
private getPreloadStateStr() {
4242
switch (this.storage.state) {
43-
case FragPreloadRequestState.IDLE:
44-
return 'IDLE';
45-
case FragPreloadRequestState.LOADING:
43+
case FragRequestState.IDLE:
44+
return 'IDLE ';
45+
case FragRequestState.LOADING:
4646
return 'LOADING';
4747
}
4848
}
4949

50-
public haveMatchingRequest(frag: Fragment, part: Part | null): boolean {
51-
const request = this.storage.info;
50+
public has(frag: Fragment, part: Part | undefined): boolean {
51+
const { request } = this.storage;
5252
return (
53-
request !== null &&
53+
request !== undefined &&
5454
request.frag.sn === frag.sn &&
5555
request.part?.index === part?.index
5656
);
5757
}
5858

59+
public get loading(): boolean {
60+
const { request, state } = this.storage;
61+
return request !== undefined && state !== FragRequestState.IDLE;
62+
}
63+
5964
public preload(frag: Fragment, part: Part | undefined): void {
60-
// We might have a stale request preloaded
61-
const { info, state } = this.storage;
62-
if (info && state !== FragPreloadRequestState.IDLE) {
65+
if (this.has(frag, part)) {
6366
return;
67+
} else {
68+
this.abort();
6469
}
6570

6671
this.log(
@@ -69,57 +74,52 @@ export default class FragmentPreloader extends FragmentLoader {
6974
}:${part?.index}`,
7075
);
7176

72-
const noop = () => {};
7377
const loadPromise =
7478
part !== undefined
7579
? this.loadPart(frag, part, noop)
7680
: this.load(frag, noop);
7781

7882
const request = {
7983
frag,
80-
part: part ?? null,
84+
part,
8185
loadPromise,
8286
};
8387

8488
this.storage = {
85-
info: request,
86-
state: FragPreloadRequestState.LOADING,
89+
request: request,
90+
state: FragRequestState.LOADING,
8791
};
8892
}
8993

9094
public getCachedRequest(
9195
frag: Fragment,
92-
part: Part | null,
93-
): Promise<FragLoadedData | PartsLoadedData> | null {
94-
const request = this.storage.info;
95-
if (request) {
96-
this.log(
97-
`[${this.getPreloadStateStr()}] check cache for [${frag.type}] ${
98-
frag.sn
99-
}:${part?.index} / preloadInfo=${request?.frag?.sn}/${
100-
request?.part?.index
101-
}`,
102-
);
96+
part: Part | undefined,
97+
): Promise<FragLoadedData | PartsLoadedData> | undefined {
98+
const request = this.storage.request;
99+
100+
if (!request) {
101+
return undefined;
103102
}
104-
if (
105-
this.storage.state !== FragPreloadRequestState.IDLE &&
106-
request &&
107-
this.haveMatchingRequest(frag, part)
108-
) {
109-
// Do we need to merge the preload frag into the frag/part?
103+
104+
const cacheHit = this.has(frag, part);
105+
106+
this.log(
107+
`[${this.getPreloadStateStr()}] check cache for [${frag.type}] ${
108+
frag.sn
109+
}:${part?.index ?? ''} / have: ${request.frag.sn}:${request.part?.index ?? ''} hit=${cacheHit}`,
110+
);
111+
if (cacheHit) {
110112
return request.loadPromise.then((data) => {
111113
mergeFragData(frag, part, data);
112114
this.reset();
113115
return data;
114116
});
115-
}
116-
117-
if (request && this.storage.state !== FragPreloadRequestState.IDLE) {
117+
} else if (this.loading) {
118118
const { frag: preloadFrag, part: preloadPart } = request;
119119
const haveOldSn = preloadFrag.sn < frag.sn;
120120
const haveOldPart =
121-
preloadPart !== null &&
122-
part !== null &&
121+
preloadPart !== undefined &&
122+
part !== undefined &&
123123
!haveOldSn &&
124124
preloadPart.index < part.index;
125125

@@ -128,7 +128,7 @@ export default class FragmentPreloader extends FragmentLoader {
128128
}
129129
}
130130

131-
return null;
131+
return undefined;
132132
}
133133

134134
public revalidate(data: LevelLoadedData | TrackLoadedData) {
@@ -144,16 +144,16 @@ export default class FragmentPreloader extends FragmentLoader {
144144
}
145145

146146
public get frag() {
147-
if (this.storage.info) {
148-
return this.storage.info.frag;
147+
if (this.storage.request) {
148+
return this.storage.request.frag;
149149
}
150-
return null;
150+
return undefined;
151151
}
152152

153153
public reset() {
154154
this.storage = {
155-
info: null,
156-
state: FragPreloadRequestState.IDLE,
155+
request: undefined,
156+
state: FragRequestState.IDLE,
157157
};
158158
}
159159

@@ -168,9 +168,11 @@ export default class FragmentPreloader extends FragmentLoader {
168168
}
169169
}
170170

171+
function noop() {}
172+
171173
function mergeFragData(
172174
frag: Fragment,
173-
part: Part | null,
175+
part: Part | undefined,
174176
data: FragLoadedData,
175177
) {
176178
const loadedFrag = data.frag;

0 commit comments

Comments
 (0)