Skip to content

Commit dd47a6a

Browse files
committed
Load key for fragment of selected LL-HLS part
1 parent f69a9f1 commit dd47a6a

3 files changed

Lines changed: 40 additions & 26 deletions

File tree

api-extractor/report/hls.js.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ export class BaseStreamController extends TaskLoop implements NetworkComponentAP
477477
// (undocumented)
478478
protected decrypter: Decrypter;
479479
// (undocumented)
480-
protected _doFragLoad(frag: Fragment, level: Level, targetBufferTime?: number | null, progressCallback?: FragmentLoadProgressCallback): Promise<PartsLoadedData | FragLoadedData | null>;
480+
protected _doFragLoad(frag: MediaFragment, level: Level, targetBufferTime?: number | null, progressCallback?: FragmentLoadProgressCallback): Promise<PartsLoadedData | FragLoadedData | null>;
481481
// (undocumented)
482482
protected doTick(): void;
483483
// (undocumented)

src/controller/base-stream-controller.ts

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -927,20 +927,10 @@ export default class BaseStreamController
927927
frag: PartsLoadedData | FragLoadedData,
928928
) {}
929929

930-
protected _doFragLoad(
931-
frag: Fragment,
932-
level: Level,
933-
targetBufferTime: number | null = null,
934-
progressCallback?: FragmentLoadProgressCallback,
935-
): Promise<PartsLoadedData | FragLoadedData | null> {
936-
this.fragCurrent = frag;
937-
const details = level.details;
938-
if (!this.levels || !details) {
939-
throw new Error(
940-
`frag load aborted, missing level${details ? '' : ' detail'}s`,
941-
);
942-
}
943-
930+
private loadKeyFor(
931+
frag: MediaFragment,
932+
details: LevelDetails,
933+
): Promise<KeyLoadedData | void> | null {
944934
let keyLoadingPromise: Promise<KeyLoadedData | void> | null = null;
945935
if (frag.encrypted && !frag.decryptdata?.key) {
946936
this.log(
@@ -957,23 +947,37 @@ export default class BaseStreamController
957947
}
958948
});
959949
this.hls.trigger(Events.KEY_LOADING, { frag });
960-
if ((this.fragCurrent as Fragment | null) === null) {
961-
this.log(`context changed in KEY_LOADING`);
962-
return Promise.resolve(null);
963-
}
964950
} else if (!frag.encrypted) {
965951
keyLoadingPromise = this.keyLoader.loadClear(
966952
frag,
967953
details.encryptedFragments,
968954
this.startFragRequested,
969955
);
970956
if (keyLoadingPromise) {
971-
this.log(`[eme] blocking frag load until media-keys acquired`);
957+
this.log(
958+
`[eme] blocking frag sn: ${frag.sn} load until media-keys acquired`,
959+
);
972960
}
973961
}
962+
return keyLoadingPromise;
963+
}
964+
965+
protected _doFragLoad(
966+
frag: MediaFragment,
967+
level: Level,
968+
targetBufferTime: number | null = null,
969+
progressCallback?: FragmentLoadProgressCallback,
970+
): Promise<PartsLoadedData | FragLoadedData | null> {
971+
this.fragCurrent = frag;
972+
const details = level.details;
973+
if (!this.levels || !details) {
974+
throw new Error(
975+
`frag load aborted, missing level${details ? '' : ' detail'}s`,
976+
);
977+
}
974978

975979
const fragPrevious = this.fragPrevious;
976-
if (isMediaFragment(frag) && !mediaFragmentsAreEqual(frag, fragPrevious)) {
980+
if (!mediaFragmentsAreEqual(frag, fragPrevious)) {
977981
const shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
978982
if (shouldLoadParts !== this.loadingParts) {
979983
this.log(
@@ -985,7 +989,7 @@ export default class BaseStreamController
985989
}
986990
}
987991
targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
988-
if (this.loadingParts && isMediaFragment(frag)) {
992+
if (this.loadingParts) {
989993
const partList = details.partList;
990994
if (partList && progressCallback) {
991995
if (targetBufferTime > details.fragmentEnd && details.fragmentHint) {
@@ -1005,6 +1009,10 @@ export default class BaseStreamController
10051009
this.loadingParts = false;
10061010
return Promise.resolve(null);
10071011
}
1012+
const keyLoadingPromise = this.loadKeyFor(frag, details);
1013+
if (this.fragContextChanged(frag)) {
1014+
return Promise.resolve(null);
1015+
}
10081016
this.log(
10091017
`Loading ${frag.type} sn: ${frag.sn} part: ${part.index} (${partIndex}/${partList.length - 1}) of ${this.fragInfo(frag, false, part)} cc: ${
10101018
frag.cc
@@ -1066,7 +1074,7 @@ export default class BaseStreamController
10661074
}
10671075
}
10681076

1069-
if (isMediaFragment(frag) && this.loadingParts) {
1077+
if (this.loadingParts) {
10701078
this.log(
10711079
`LL-Part loading OFF after next part miss @${targetBufferTime} Check buffer at sn: ${frag.sn} loaded parts: ${details.partList?.filter((p) => p.loaded).map((p) => `[${p.start}-${p.end}]`)}`,
10721080
);
@@ -1076,6 +1084,13 @@ export default class BaseStreamController
10761084
return Promise.resolve(null);
10771085
}
10781086

1087+
const keyLoadingPromise = this.loadKeyFor(frag, details);
1088+
if (this.fragContextChanged(frag)) {
1089+
this.log(
1090+
`Context changed in KEY_LOADING sn: ${frag.sn} ${frag.relurl} > ${this.fragCurrent?.relurl}`,
1091+
);
1092+
return Promise.resolve(null);
1093+
}
10791094
this.log(
10801095
`Loading ${frag.type} sn: ${frag.sn} of ${this.fragInfo(frag, false)} cc: ${frag.cc} ${
10811096
'[' + details.startSN + '-' + details.endSN + ']'
@@ -1094,7 +1109,6 @@ export default class BaseStreamController
10941109
this.config.progressive && frag.type !== PlaylistLevelType.SUBTITLE;
10951110

10961111
const initDataPromise = this.loadInitSegmentIfNeeded(frag);
1097-
10981112
let result: Promise<PartsLoadedData | FragLoadedData | null>;
10991113
if (dataOnProgress && keyLoadingPromise) {
11001114
result = keyLoadingPromise
@@ -2073,7 +2087,7 @@ export default class BaseStreamController
20732087
}
20742088
if (this.fragContextChanged(frag)) {
20752089
this.warn(
2076-
`Frag load error must match current frag to retry ${frag.url} > ${this.fragCurrent?.url}`,
2090+
`Frag load error must match current frag to retry ${frag.relurl} > ${this.fragCurrent?.relurl}`,
20772091
);
20782092
return;
20792093
}

src/controller/stream-controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,7 @@ export default class StreamController
11631163
return audioCodec;
11641164
}
11651165

1166-
private _loadBitrateTestFrag(fragment: Fragment, level: Level) {
1166+
private _loadBitrateTestFrag(fragment: MediaFragment, level: Level) {
11671167
fragment.bitrateTest = true;
11681168
this._doFragLoad(fragment, level)
11691169
.then((data) => {

0 commit comments

Comments
 (0)