Skip to content

Commit 8d42987

Browse files
committed
chore: Simplify ABR management between player and preload manager
1 parent ca63ed0 commit 8d42987

File tree

3 files changed

+46
-115
lines changed

3 files changed

+46
-115
lines changed

lib/abr/simple_abr_manager.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ shaka.abr.SimpleAbrManager = class {
162162
this.resizeObserver_ = null;
163163
}
164164

165-
this.resizeObserverTimer_.stop();
165+
if (this.resizeObserverTimer_) {
166+
this.resizeObserverTimer_.stop();
167+
}
166168

167169
this.pictureInPictureWindow_ = null;
168170

@@ -177,7 +179,7 @@ shaka.abr.SimpleAbrManager = class {
177179
* @export
178180
*/
179181
release() {
180-
// stop() should already have been called for unload
182+
this.stop();
181183
this.eventManager_.release();
182184
this.resizeObserverTimer_ = null;
183185
}

lib/media/preload_manager.js

Lines changed: 20 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,9 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
108108
/** @private {boolean} */
109109
this.drmEngineEntrusted_ = false;
110110

111-
/** @private {?shaka.extern.AbrManager.Factory} */
112-
this.abrManagerFactory_ = null;
113-
114111
/** @private {shaka.extern.AbrManager} */
115112
this.abrManager_ = null;
116113

117-
/** @private {boolean} */
118-
this.abrManagerEntrusted_ = false;
119-
120114
/** @private {!Map<number, shaka.media.SegmentPrefetch>} */
121115
this.segmentPrefetchById_ = new Map();
122116

@@ -150,9 +144,6 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
150144
/** @private {?shaka.extern.Stream} */
151145
this.prefetchedTextStream_ = null;
152146

153-
/** @private {boolean} */
154-
this.allowMakeAbrManager_ = typedPlayerInterface.allowMakeAbrManager;
155-
156147
/** @private {boolean} */
157148
this.hasBeenAttached_ = false;
158149

@@ -257,28 +248,6 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
257248
return this.currentAdaptationSetCriteria_;
258249
}
259250

260-
/** @return {?shaka.extern.AbrManager.Factory} */
261-
getAbrManagerFactory() {
262-
return this.abrManagerFactory_;
263-
}
264-
265-
/**
266-
* Gets the abr manager, if it exists. Also marks that the abr manager should
267-
* not be stopped if this manager is destroyed.
268-
* @return {?shaka.extern.AbrManager}
269-
*/
270-
receiveAbrManager() {
271-
this.abrManagerEntrusted_ = true;
272-
return this.abrManager_;
273-
}
274-
275-
/**
276-
* @return {?shaka.extern.AbrManager}
277-
*/
278-
getAbrManager() {
279-
return this.abrManager_;
280-
}
281-
282251
/**
283252
* Gets the parser, if it exists. Also marks that the parser should not be
284253
* stopped if this manager is destroyed.
@@ -388,15 +357,6 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
388357
return this.segmentPrefetchById_;
389358
}
390359

391-
/**
392-
* @param {?shaka.extern.AbrManager} abrManager
393-
* @param {?shaka.extern.AbrManager.Factory} abrFactory
394-
*/
395-
attachAbrManager(abrManager, abrFactory) {
396-
this.abrManager_ = abrManager;
397-
this.abrManagerFactory_ = abrFactory;
398-
}
399-
400360
/**
401361
* @param {?shaka.media.AdaptationSetCriteria} adaptationSetCriteria
402362
*/
@@ -701,25 +661,18 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
701661
});
702662
}
703663

704-
// Make the ABR manager.
705-
if (this.allowMakeAbrManager_) {
706-
const abrFactory = this.config_.abrFactory;
707-
this.abrManagerFactory_ = abrFactory;
708-
this.abrManager_ = abrFactory();
709-
this.abrManager_.configure(this.config_.abr);
710-
}
711-
712-
const variant = this.configureAbrManagerAndChooseVariant_();
713-
if (variant &&
714-
this.shouldCreateSegmentIndexBeforeDrmEngineInitialization_()) {
715-
const createSegmentIndexPromises = [];
716-
for (const stream of [variant.video, variant.audio]) {
717-
if (stream && !stream.segmentIndex) {
718-
createSegmentIndexPromises.push(stream.createSegmentIndex());
664+
if (this.shouldCreateSegmentIndexBeforeDrmEngineInitialization_()) {
665+
const variant = this.configureAbrManagerAndChooseVariant_();
666+
if (variant) {
667+
const createSegmentIndexPromises = [];
668+
for (const stream of [variant.video, variant.audio]) {
669+
if (stream && !stream.segmentIndex) {
670+
createSegmentIndexPromises.push(stream.createSegmentIndex());
671+
}
672+
}
673+
if (createSegmentIndexPromises.length > 0) {
674+
await Promise.all(createSegmentIndexPromises);
719675
}
720-
}
721-
if (createSegmentIndexPromises.length > 0) {
722-
await Promise.all(createSegmentIndexPromises);
723676
}
724677
}
725678
}
@@ -784,12 +737,18 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
784737
goog.asserts.assert(this.currentAdaptationSetCriteria_,
785738
'Must have an AdaptationSetCriteria');
786739

740+
if (!this.abrManager_) {
741+
// Make the ABR manager.
742+
const abrFactory = this.config_.abrFactory;
743+
this.abrManager_ = abrFactory();
744+
this.abrManager_.configure(this.config_.abr);
745+
}
746+
787747
const playableVariants = shaka.util.StreamUtils.getPlayableVariants(
788748
this.manifest_.variants);
789749
const adaptationSet = this.currentAdaptationSetCriteria_.create(
790750
playableVariants);
791751
// Guess what the first variant will be, based on a SimpleAbrManager.
792-
this.abrManager_.configure(this.config_.abr);
793752
this.abrManager_.setVariants(Array.from(adaptationSet.values()));
794753

795754
return this.abrManager_.chooseVariant(/* preferFastSwitching= */ true);
@@ -895,8 +854,8 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
895854
if (this.parser_ && !this.parserEntrusted_) {
896855
await this.parser_.stop();
897856
}
898-
if (this.abrManager_ && !this.abrManagerEntrusted_) {
899-
await this.abrManager_.stop();
857+
if (this.abrManager_) {
858+
this.abrManager_.release();
900859
}
901860
if (this.regionTimeline_ && !this.regionTimelineEntrusted_) {
902861
this.regionTimeline_.release();
@@ -965,7 +924,6 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
965924
* networkingEngine: !shaka.net.NetworkingEngine,
966925
* manifestFilterer: !shaka.media.ManifestFilterer,
967926
* allowPrefetch: boolean,
968-
* allowMakeAbrManager: boolean,
969927
* }}
970928
*
971929
* @property {!shaka.extern.PlayerConfiguration} config
@@ -978,6 +936,5 @@ shaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {
978936
* @property {!shaka.net.NetworkingEngine} networkingEngine
979937
* @property {!shaka.media.ManifestFilterer} manifestFilterer
980938
* @property {boolean} allowPrefetch
981-
* @property {boolean} allowMakeAbrManager
982939
*/
983940
shaka.media.PreloadManager.PlayerInterface;

lib/player.js

Lines changed: 22 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,7 +1512,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
15121512
// components, we do not release the instance, we will reuse it in later
15131513
// loads.
15141514
if (this.abrManager_) {
1515-
await this.abrManager_.stop();
1515+
this.abrManager_.stop();
15161516
}
15171517

15181518
// Streaming engine will push new data to media source engine, so we need
@@ -1945,15 +1945,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
19451945
await this.drmEngine_.attach(this.video_);
19461946
}, 'drmEngine_.attach');
19471947

1948-
// Also get the ABR manager, which has special logic related to being
1949-
// received.
1950-
const abrManagerFactory = preloadManager.getAbrManagerFactory();
1951-
if (abrManagerFactory) {
1952-
const abrManager = preloadManager.receiveAbrManager();
1953-
if (this.abrManager_ && this.abrManager_ !== abrManager) {
1948+
1949+
const abrFactory = this.config_.abrFactory;
1950+
if (!this.abrManager_ || this.abrManagerFactory_ != abrFactory) {
1951+
this.abrManagerFactory_ = abrFactory;
1952+
if (this.abrManager_) {
19541953
this.abrManager_.release();
19551954
}
1956-
this.abrManager_ = abrManager;
1955+
this.abrManager_ = abrFactory();
19571956
if (typeof this.abrManager_.setMediaElement != 'function') {
19581957
shaka.Deprecate.deprecateFeature(5,
19591958
'AbrManager w/o setMediaElement',
@@ -1972,7 +1971,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
19721971
'Please use an AbrManager with trySuggestStreams function.');
19731972
this.abrManager_.trySuggestStreams = () => {};
19741973
}
1975-
this.abrManagerFactory_ = abrManagerFactory;
1974+
this.abrManager_.configure(this.config_.abr);
19761975
}
19771976

19781977
// Load the asset.
@@ -2087,8 +2086,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
20872086
this.mimeType_,
20882087
this.config_,
20892088
/* allowPrefetch= */ true,
2090-
/* disableVideo= */ false,
2091-
/* allowMakeAbrManager= */ false);
2089+
/* disableVideo= */ false);
20922090
this.createdPreloadManagers_.push(preloadManager);
20932091
if (this.parser_ && this.parser_.setMediaElement) {
20942092
this.parser_.setMediaElement(/* mediaElement= */ null);
@@ -2192,25 +2190,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
21922190
}
21932191
const preloadConfig = config || this.config_;
21942192
let disableVideo = false;
2195-
let allowMakeAbrManager = true;
2196-
if (standardLoad) {
2197-
if (this.abrManager_ &&
2198-
this.abrManagerFactory_ == preloadConfig.abrFactory) {
2199-
// If there's already an abr manager, don't make a new abr manager at
2200-
// all.
2201-
// In standardLoad mode, the abr manager isn't used for anything anyway,
2202-
// so it should only be created to create an abr manager for the player
2203-
// to use... which is unnecessary if we already have one of the right
2204-
// type.
2205-
allowMakeAbrManager = false;
2206-
}
2207-
if (this.video_ && this.video_.nodeName === 'AUDIO') {
2208-
disableVideo = true;
2209-
}
2193+
if (standardLoad && this.video_ && this.video_.nodeName === 'AUDIO') {
2194+
disableVideo = true;
22102195
}
22112196
let preloadManagerPromise = this.makePreloadManager_(
22122197
assetUri, startTime, mimeType || null, preloadConfig,
2213-
/* allowPrefetch= */ !standardLoad, disableVideo, allowMakeAbrManager);
2198+
/* allowPrefetch= */ !standardLoad, disableVideo);
22142199
if (!standardLoad) {
22152200
// We only need to track the PreloadManager if it is not part of a
22162201
// standard load. If it is, the load() method will handle destroying it.
@@ -2237,12 +2222,11 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
22372222
* @param {shaka.extern.PlayerConfiguration} preloadConfig
22382223
* @param {boolean=} allowPrefetch
22392224
* @param {boolean=} disableVideo
2240-
* @param {boolean=} allowMakeAbrManager
22412225
* @return {!Promise<!shaka.media.PreloadManager>}
22422226
* @private
22432227
*/
22442228
async makePreloadManager_(assetUri, startTime, mimeType, preloadConfig,
2245-
allowPrefetch = true, disableVideo = false, allowMakeAbrManager = true) {
2229+
allowPrefetch = true, disableVideo = false) {
22462230
goog.asserts.assert(this.networkingEngine_, 'Must have net engine');
22472231
/** @type {?shaka.media.PreloadManager} */
22482232
let preloadManager = null;
@@ -2466,14 +2450,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
24662450
manifestFilterer,
24672451
networkingEngine,
24682452
allowPrefetch,
2469-
allowMakeAbrManager,
24702453
};
24712454
preloadManager = new shaka.media.PreloadManager(
24722455
assetUri, mimeType, startTime, playerInterface);
2473-
if (!allowMakeAbrManager) {
2474-
preloadManager.attachAbrManager(
2475-
this.abrManager_, this.abrManagerFactory_);
2476-
}
24772456
return preloadManager;
24782457
}
24792458

@@ -3746,13 +3725,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
37463725
getPreloadManager = () => null;
37473726
}
37483727

3749-
const getAbrManager = () => {
3750-
if (getPreloadManager()) {
3751-
return getPreloadManager().getAbrManager();
3752-
} else {
3753-
return this.abrManager_;
3754-
}
3755-
};
37563728
const getParser = () => {
37573729
if (getPreloadManager()) {
37583730
return getPreloadManager().getParser();
@@ -3784,14 +3756,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
37843756
/** @type {shaka.net.NetworkingEngine.onProgressUpdated} */
37853757
const onProgressUpdated_ = (deltaTimeMs,
37863758
bytesDownloaded, allowSwitch, request, context) => {
3787-
// In some situations, such as during offline storage, the abr manager
3788-
// might not yet exist. Therefore, we need to check if abr manager has
3789-
// been initialized before using it.
3790-
const abrManager = getAbrManager();
3791-
if (abrManager) {
3792-
abrManager.segmentDownloaded(deltaTimeMs, bytesDownloaded,
3793-
allowSwitch, request, context);
3794-
}
3759+
lateQueue(() => {
3760+
if (this.abrManager_) {
3761+
this.abrManager_.segmentDownloaded(deltaTimeMs, bytesDownloaded,
3762+
allowSwitch, request, context);
3763+
}
3764+
});
37953765
};
37963766
/** @type {shaka.net.NetworkingEngine.OnHeadersReceived} */
37973767
const onHeadersReceived_ = (headers, request, requestType) => {
@@ -3831,7 +3801,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
38313801
/** @type {shaka.net.NetworkingEngine.OnRequest} */
38323802
const onRequest_ = (type, request, context) => {
38333803
lateQueue(() => {
3834-
this.cmcdManager_.applyRequestData(type, request, context);
3804+
if (this.cmcdManager_) {
3805+
this.cmcdManager_.applyRequestData(type, request, context);
3806+
}
38353807
});
38363808
};
38373809

0 commit comments

Comments
 (0)