Skip to content

Commit f24afbf

Browse files
committed
Add resize observer for the video element to trigger reinitialization of the BOLA rule check of the playback quality in case limitBitrateByPortal is enabled
1 parent 1b70623 commit f24afbf

File tree

5 files changed

+44
-22
lines changed

5 files changed

+44
-22
lines changed

index.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3113,8 +3113,6 @@ export interface AbrController {
31133113

31143114
setPlaybackQuality(type: string, streamInfo: StreamInfo, representation: Representation, reason: object): void;
31153115

3116-
setWindowResizeEventCalled(value: any): void;
3117-
31183116
unRegisterStreamType(streamId: string, type: string): void;
31193117
}
31203118

src/streaming/controllers/AbrController.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ function AbrController() {
7272
streamProcessorDict,
7373
switchRequestHistory,
7474
throughputController,
75-
videoModel,
76-
windowResizeEventCalled;
75+
videoModel
7776

7877
function setup() {
7978
logger = debug.getLogger(instance);
@@ -97,6 +96,7 @@ function AbrController() {
9796
eventBus.on(MediaPlayerEvents.QUALITY_CHANGE_RENDERED, _onQualityChangeRendered, instance);
9897
eventBus.on(MediaPlayerEvents.METRIC_ADDED, _onMetricAdded, instance);
9998
eventBus.on(Events.LOADING_PROGRESS, _onFragmentLoadProgress, instance);
99+
eventBus.on(Events.VIDEO_ELEMENT_RESIZED, _onVideoElementResized, instance);
100100
}
101101

102102
/**
@@ -152,9 +152,6 @@ function AbrController() {
152152
streamProcessorDict = {};
153153
queuedManualQualitySwitches = new Map();
154154

155-
if (windowResizeEventCalled === undefined) {
156-
windowResizeEventCalled = false;
157-
}
158155
if (droppedFramesHistory) {
159156
droppedFramesHistory.reset();
160157
}
@@ -177,6 +174,7 @@ function AbrController() {
177174
eventBus.off(MediaPlayerEvents.QUALITY_CHANGE_RENDERED, _onQualityChangeRendered, instance);
178175
eventBus.off(MediaPlayerEvents.METRIC_ADDED, _onMetricAdded, instance);
179176
eventBus.off(Events.LOADING_PROGRESS, _onFragmentLoadProgress, instance);
177+
eventBus.off(Events.VIDEO_ELEMENT_RESIZED, _onVideoElementResized, instance);
180178

181179
if (abrRulesCollection) {
182180
abrRulesCollection.reset();
@@ -563,6 +561,16 @@ function AbrController() {
563561
}
564562
}
565563

564+
function _onVideoElementResized() {
565+
if (settings.get().streaming.abr.limitBitrateByPortal) {
566+
Object.keys(streamProcessorDict).forEach(streamId => {
567+
Object.keys(streamProcessorDict[streamId]).forEach(mediaType => {
568+
checkPlaybackQuality(mediaType, streamId);
569+
});
570+
});
571+
}
572+
}
573+
566574
function _createRulesContext(streamProcessor, currentRequest) {
567575
return RulesContext(context).create({
568576
abrController: instance,
@@ -976,10 +984,6 @@ function AbrController() {
976984
return voRepresentations[voRepresentations.length - 1].id === representation.id;
977985
}
978986

979-
function setWindowResizeEventCalled(value) {
980-
windowResizeEventCalled = value;
981-
}
982-
983987
function clearDataForStream(streamId) {
984988
if (droppedFramesHistory) {
985989
droppedFramesHistory.clearForStream(streamId);
@@ -1022,7 +1026,6 @@ function AbrController() {
10221026
reset,
10231027
setConfig,
10241028
setPlaybackQuality,
1025-
setWindowResizeEventCalled,
10261029
unRegisterStreamType,
10271030
};
10281031

src/streaming/models/VideoModel.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ function VideoModel() {
5252
instance,
5353
logger,
5454
previousPlaybackRate,
55+
resizeObserver,
5556
resumeReadyStateFunction,
5657
setCurrentTimeReadyStateFunction,
5758
settings,
@@ -68,6 +69,9 @@ function VideoModel() {
6869
function setup() {
6970
logger = Debug(context).getInstance().getLogger(instance);
7071
settings = Settings(context).getInstance();
72+
resizeObserver = new ResizeObserver(() => {
73+
eventBus.trigger(Events.VIDEO_ELEMENT_RESIZED);
74+
});
7175
_currentTime = NaN;
7276
}
7377

@@ -79,6 +83,15 @@ function VideoModel() {
7983
clearTimeout(timeout);
8084
eventBus.off(Events.PLAYBACK_PLAYING, onPlaying, this);
8185
stalledStreams.length = 0;
86+
_disposeResizeObserver();
87+
}
88+
89+
function _disposeResizeObserver() {
90+
if (resizeObserver && element) {
91+
resizeObserver.unobserve(element);
92+
resizeObserver.disconnect();
93+
resizeObserver = null;
94+
}
8295
}
8396

8497
function setConfig(config) {
@@ -186,11 +199,16 @@ function VideoModel() {
186199
//add check of value type
187200
if (value === null || value === undefined || (value && (/^(VIDEO|AUDIO)$/i).test(value.nodeName))) {
188201
element = value;
202+
_registerResizeObserver(element);
189203
} else {
190204
throw VIDEO_MODEL_WRONG_ELEMENT_TYPE;
191205
}
192206
}
193207

208+
function _registerResizeObserver(element) {
209+
resizeObserver.observe(element);
210+
}
211+
194212
function setSource(source) {
195213
if (element) {
196214
if (source) {

src/streaming/rules/abr/BolaRule.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ function BolaRule(config) {
8585
eventBus.on(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);
8686
eventBus.on(Events.SETTING_UPDATED_MAX_BITRATE, _onMinMaxBitrateUpdated, instance);
8787
eventBus.on(Events.SETTING_UPDATED_MIN_BITRATE, _onMinMaxBitrateUpdated, instance);
88+
eventBus.on(Events.VIDEO_ELEMENT_RESIZED, _onVideoElementResized, instance);
8889
}
8990

9091
/**
@@ -393,7 +394,17 @@ function BolaRule(config) {
393394
* @private
394395
*/
395396
function _onMinMaxBitrateUpdated() {
396-
resetInitialSettings()
397+
resetInitialSettings();
398+
}
399+
400+
/**
401+
* We need to reset to initial settings because the number of available Representations might have changed
402+
* @private
403+
*/
404+
function _onVideoElementResized() {
405+
if (settings.get().streaming.abr.limitBitrateByPortal) {
406+
resetInitialSettings();
407+
}
397408
}
398409

399410

@@ -631,6 +642,7 @@ function BolaRule(config) {
631642
eventBus.off(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);
632643
eventBus.off(Events.SETTING_UPDATED_MAX_BITRATE, _onMinMaxBitrateUpdated, instance);
633644
eventBus.off(Events.SETTING_UPDATED_MIN_BITRATE, _onMinMaxBitrateUpdated, instance);
645+
eventBus.off(Events.VIDEO_ELEMENT_RESIZED, _onVideoElementResized, instance);
634646
}
635647

636648
instance = {

test/unit/mocks/AbrControllerMock.js

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ function AbrControllerMock () {
44
this.qualityDict = {};
55
this.elementWidth = undefined;
66
this.elementHeight = undefined;
7-
this.windowResizeEventCalled = false;
87
this.currentStreamId = undefined;
98
this.topBitrateInfo = null;
109
let self = this;
@@ -65,14 +64,6 @@ function AbrControllerMock () {
6564
this.qualityDict[id][type] = value;
6665
};
6766

68-
this.setWindowResizeEventCalled = function (value) {
69-
this.windowResizeEventCalled = value;
70-
};
71-
72-
this.getWindowResizeEventCalled = function () {
73-
return this.windowResizeEventCalled;
74-
};
75-
7667
this.setElementSize = function () {
7768
this.elementWidth = 10;
7869
this.elementHeight = 10;

0 commit comments

Comments
 (0)