@@ -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 }
0 commit comments