12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- // @flow
-
- import {
- CONFERENCE_JOINED,
- VIDEO_QUALITY_LEVELS,
- setMaxReceiverVideoQuality,
- setPreferredVideoQuality
- } from '../base/conference';
- import { getParticipantCount } from '../base/participants';
- import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux';
- import { shouldDisplayTileView } from '../video-layout';
-
- import { getReceiverVideoQualityLevel } from './functions';
- import logger from './logger';
- import { getMinHeightForQualityLvlMap } from './selector';
-
- /**
- * 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;
- });
-
- /**
- * 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;
- const participantCount = getParticipantCount(state);
-
- return {
- displayTileView: _shouldDisplayTileView,
- participantCount,
- reducedUI,
- thumbnailHeight: thumbnailSize?.height
- };
- },
- /* listener */ ({ displayTileView, participantCount, reducedUI, thumbnailHeight }, { dispatch, getState }) => {
- const state = getState();
- const { maxReceiverVideoQuality } = state['features/base/conference'];
- const { maxFullResolutionParticipants = 2 } = state['features/base/config'];
-
- let newMaxRecvVideoQuality = VIDEO_QUALITY_LEVELS.HIGH;
-
- if (reducedUI) {
- newMaxRecvVideoQuality = VIDEO_QUALITY_LEVELS.LOW;
- } else if (displayTileView && !Number.isNaN(thumbnailHeight)) {
- newMaxRecvVideoQuality = getReceiverVideoQualityLevel(thumbnailHeight, getMinHeightForQualityLvlMap(state));
-
- // Override HD level calculated for the thumbnail height when # of participants threshold is exceeded
- if (maxReceiverVideoQuality !== newMaxRecvVideoQuality && maxFullResolutionParticipants !== -1) {
- const override
- = participantCount > maxFullResolutionParticipants
- && newMaxRecvVideoQuality > VIDEO_QUALITY_LEVELS.STANDARD;
-
- logger.info(`Video quality level for thumbnail height: ${thumbnailHeight}, `
- + `is: ${newMaxRecvVideoQuality}, `
- + `override: ${String(override)}, `
- + `max full res N: ${maxFullResolutionParticipants}`);
-
- if (override) {
- newMaxRecvVideoQuality = VIDEO_QUALITY_LEVELS.STANDARD;
- }
- }
- }
-
- if (maxReceiverVideoQuality !== newMaxRecvVideoQuality) {
- dispatch(setMaxReceiverVideoQuality(newMaxRecvVideoQuality));
- }
- }, {
- deepEquals: true
- });
|