Skip to content

Commit 2f80070

Browse files
committed
Add detection of open-ended byterange requests and ignore them for now. Add skeleton for fetch loader support of these requests.
1 parent bd90920 commit 2f80070

File tree

2 files changed

+52
-11
lines changed

2 files changed

+52
-11
lines changed

src/loader/fragment-preloader.ts

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from '../types/events';
1010
import { HlsConfig } from '../hls';
1111
import { logger } from '../utils/logger';
12+
import FetchLoader from '../utils/fetch-loader';
1213

1314
export const enum FragRequestState {
1415
IDLE,
@@ -32,6 +33,7 @@ export default class FragmentPreloader extends FragmentLoader {
3233
state: FragRequestState.IDLE,
3334
};
3435
protected log: (msg: any) => void;
36+
private fetchLoader?: FetchLoader | undefined;
3537

3638
constructor(config: HlsConfig, logPrefix: string) {
3739
super(config);
@@ -49,10 +51,38 @@ export default class FragmentPreloader extends FragmentLoader {
4951

5052
public has(frag: Fragment, part: Part | undefined): boolean {
5153
const { request } = this.storage;
54+
55+
if (request === undefined || request.frag.sn !== frag.sn) {
56+
return false;
57+
}
58+
59+
const requestPart = request.part;
60+
// frag preload hint only
61+
if (requestPart === undefined && part === undefined) {
62+
return true;
63+
}
64+
65+
// mismatched part / frag
66+
if (requestPart === undefined || part === undefined) {
67+
return false;
68+
}
69+
70+
if (requestPart.index === part.index) {
71+
return true;
72+
}
73+
74+
// Return true if byterange into requested part AND fetch loader exists
5275
return (
53-
request !== undefined &&
54-
request.frag.sn === frag.sn &&
55-
request.part?.index === part?.index
76+
this.fetchLoader !== undefined &&
77+
// request is byterange
78+
requestPart.byteRangeStartOffset !== undefined &&
79+
requestPart.byteRangeEndOffset !== undefined &&
80+
// part is byterange
81+
part.byteRangeStartOffset !== undefined &&
82+
part.byteRangeEndOffset !== undefined &&
83+
// part byterange contained within request range
84+
requestPart.byteRangeStartOffset <= part.byteRangeStartOffset &&
85+
requestPart.byteRangeEndOffset >= part.byteRangeEndOffset
5686
);
5787
}
5888

@@ -74,10 +104,17 @@ export default class FragmentPreloader extends FragmentLoader {
74104
}:${part?.index}`,
75105
);
76106

77-
const loadPromise =
78-
part !== undefined
79-
? this.loadPart(frag, part, noop)
80-
: this.load(frag, noop);
107+
let loadPromise;
108+
if (part !== undefined) {
109+
// TODO: Use fetch loader to progressively load open-ended byterange requests
110+
if (part.byteRangeEndOffset === 2 ** 53 - 1) {
111+
return;
112+
} else {
113+
loadPromise = this.loadPart(frag, part, noop);
114+
}
115+
} else {
116+
loadPromise = this.load(frag, noop);
117+
}
81118

82119
const request = {
83120
frag,

src/loader/m3u8-parser.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -697,10 +697,14 @@ export default class M3U8Parser {
697697
preloadHintAttrs['BYTERANGE-START'] ||
698698
preloadHintAttrs['BYTERANGE-LENGTH']
699699
) {
700-
const byteRangeStartOffset = preloadHintAttrs['BYTERANGE-START'] | 0;
701-
const byteRangeLength =
702-
preloadHintAttrs['BYTERANGE-LENGTH'] | (2 ** 53 - 1);
703-
byteRange = `${byteRangeLength}@${byteRangeStartOffset}`;
700+
const byteRangeStartOffset = preloadHintAttrs['BYTERANGE-START'];
701+
let byteRangeLength = preloadHintAttrs['BYTERANGE-LENGTH'];
702+
if (byteRangeLength <= 0) {
703+
byteRangeLength = 2 ** 53 - 1;
704+
}
705+
if (isFinite(byteRangeLength) && isFinite(byteRangeStartOffset)) {
706+
byteRange = `${byteRangeLength}@${byteRangeStartOffset}`;
707+
}
704708
}
705709
const preloadType = preloadHintAttrs.TYPE;
706710
if (preloadType === 'PART' && level.partList) {

0 commit comments

Comments
 (0)