2020-07-07 20:34:52 +00:00
|
|
|
// @flow
|
|
|
|
|
2020-07-15 20:30:44 +00:00
|
|
|
import {
|
|
|
|
CONFERENCE_JOINED,
|
|
|
|
VIDEO_QUALITY_LEVELS,
|
|
|
|
getNearestReceiverVideoQualityLevel,
|
|
|
|
setMaxReceiverVideoQuality,
|
|
|
|
setPreferredVideoQuality
|
|
|
|
} from '../base/conference';
|
|
|
|
import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux';
|
|
|
|
import { shouldDisplayTileView } from '../video-layout';
|
2020-07-07 20:34:52 +00:00
|
|
|
|
|
|
|
import logger from './logger';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements the middleware of the feature video-quality.
|
|
|
|
*
|
|
|
|
* @param {Store} store - The redux store.
|
|
|
|
* @returns {Function}
|
|
|
|
*/
|
|
|
|
MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
|
|
|
|
const result = next(action);
|
|
|
|
|
|
|
|
switch (action.type) {
|
|
|
|
case CONFERENCE_JOINED: {
|
|
|
|
if (navigator.product === 'ReactNative') {
|
|
|
|
const { resolution } = getState()['features/base/config'];
|
|
|
|
|
|
|
|
if (typeof resolution !== 'undefined') {
|
|
|
|
dispatch(setPreferredVideoQuality(Number.parseInt(resolution, 10)));
|
|
|
|
logger.info(`Configured preferred receiver video frame height to: ${resolution}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
});
|
2020-07-15 20:30:44 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements a state listener in order to calculate max receiver video quality.
|
|
|
|
*/
|
|
|
|
StateListenerRegistry.register(
|
|
|
|
/* selector */ state => {
|
|
|
|
const { reducedUI } = state['features/base/responsive-ui'];
|
|
|
|
const _shouldDisplayTileView = shouldDisplayTileView(state);
|
|
|
|
const thumbnailSize = state['features/filmstrip']?.tileViewDimensions?.thumbnailSize;
|
|
|
|
|
|
|
|
return {
|
|
|
|
displayTileView: _shouldDisplayTileView,
|
|
|
|
reducedUI,
|
|
|
|
thumbnailHeight: thumbnailSize?.height
|
|
|
|
};
|
|
|
|
},
|
|
|
|
/* listener */ ({ displayTileView, reducedUI, thumbnailHeight }, { dispatch, getState }) => {
|
|
|
|
const { maxReceiverVideoQuality } = getState()['features/base/conference'];
|
|
|
|
let newMaxRecvVideoQuality = VIDEO_QUALITY_LEVELS.HIGH;
|
|
|
|
|
|
|
|
if (reducedUI) {
|
|
|
|
newMaxRecvVideoQuality = VIDEO_QUALITY_LEVELS.LOW;
|
|
|
|
} else if (displayTileView && !Number.isNaN(thumbnailHeight)) {
|
|
|
|
newMaxRecvVideoQuality = getNearestReceiverVideoQualityLevel(thumbnailHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (maxReceiverVideoQuality !== newMaxRecvVideoQuality) {
|
|
|
|
dispatch(setMaxReceiverVideoQuality(newMaxRecvVideoQuality));
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
deepEquals: true
|
|
|
|
});
|