Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
41811b1
Improve background effects demo and segmentation
Dec 26, 2025
4b725a9
Update backgroundEffectsV2 module: add tests, improve shaders and con…
Dec 26, 2025
9fed0c5
Rename backgroundEffectsV2 module to BackgroundEffects and update all…
Dec 26, 2025
834c177
fix: preparing for playwright tests
Dec 26, 2025
4cfa0b7
Fix main pipeline: only enable desynchronized for OffscreenCanvas
Dec 26, 2025
5c8c697
Add performance stats tracking and metrics callback
Dec 26, 2025
a1407c2
Fix canvas2d pipeline and reduce blur downsample scale
Dec 26, 2025
9b41f6d
Add UI elements for background effects controls
Dec 29, 2025
22b2da9
Refactor BackgroundEffects: add pipeline architecture and modular com…
Dec 29, 2025
afbebf3
WIP: mid-development checkpoint - segmentation and pipeline updates
Dec 30, 2025
90a23c9
Refactor quality module: reorganize metrics and add capability policy
Dec 30, 2025
741db5e
feat: implement dynamic blur strength and improve quality controller
Dec 30, 2025
f3dafa6
refactor: major quality controller improvements with debt-based system
Dec 30, 2025
d66d784
fix: harden background effects integration
Dec 30, 2025
67c1a3e
fix: improve background effects UX
Dec 30, 2025
33c2b30
docs: Add limited release status to Background Effects README
adamlow-wire Jan 7, 2026
bb1b3d2
refactor: move BackgroundEffects to apps/webapp structure
Jan 8, 2026
56a8648
refactor: integrate BackgroundEffects and cleanup
Jan 8, 2026
515b1a4
feat: enhance BackgroundEffects pipelines and add backgrounds
Jan 8, 2026
7ff81a0
tune: adjust quality tier parameters
Jan 8, 2026
e3109ac
feat: enhance BackgroundEffects with renderer improvements and cleanup
Jan 8, 2026
0404878
Merge remote-tracking branch 'origin/dev' into feature/background-eff…
EnricoSchw Feb 17, 2026
c0f85f3
Merge remote-tracking branch 'origin' into feature/background-effects
EnricoSchw Feb 26, 2026
a50da1e
Merge remote-tracking branch 'origin/dev' into feat/background-effect…
EnricoSchw Mar 5, 2026
3c9b3f4
feat: Add a general type for the quality definition and introduce a s…
EnricoSchw Mar 9, 2026
541cd34
feat: Add BackgroundEffectsHandler
EnricoSchw Mar 11, 2026
7cd5461
feat: refactor background-effects and make controller singleton and m…
EnricoSchw Mar 13, 2026
bac7d23
feat: prevent DataCloneError when sending detached ImageBitmap to worker
EnricoSchw Mar 13, 2026
f3936ef
feat: switching from an environment feature toggle to a user-specific…
EnricoSchw Mar 16, 2026
f61ac9c
feat: persist preferred background effect so that settings remain aft…
EnricoSchw Mar 16, 2026
2ba3ccd
feat: refactor VideoControls to enhance background effects support an…
EnricoSchw Mar 17, 2026
a808f2f
feat: update VideoControls to improve background effects handling and…
EnricoSchw Mar 17, 2026
650cdc8
chore: remove unused imports in VideoControls and VideoControlsMenu
EnricoSchw Mar 17, 2026
4499b07
feat: add support for CallingRepository and BackgroundEffectsHandler …
EnricoSchw Mar 17, 2026
03afec9
Merge remote-tracking branch 'origin' into feat/background-effects-WP…
EnricoSchw Mar 17, 2026
dc76b18
chore: rename selfie_multiclass_256x256.tflite to selfie_multiclass.t…
EnricoSchw Mar 17, 2026
90f4153
fix: remove background effects strings and unused model file
EnricoSchw Mar 18, 2026
749d19b
feat: add i18n strings and update VideoControls for background effect…
EnricoSchw Mar 18, 2026
4ab368e
feat: add i18n strings for video call background effects and settings
EnricoSchw Mar 18, 2026
fe09af0
fix: restore accidentally removed i18n string for videoCallBackground…
EnricoSchw Mar 18, 2026
5ffdbe7
fix: improve error handling in FrameSource and clean up unused segmen…
EnricoSchw Mar 18, 2026
2ff9738
fix: type handling and clean up BackgroundEffects imports and styles
EnricoSchw Mar 18, 2026
2263905
fix: update QualityController tiers logic and adjust tests accordingly
EnricoSchw Mar 18, 2026
4366688
fix: add getSegmenter method and update tests for segmenter behavior
EnricoSchw Mar 18, 2026
c134c0d
feat: add selfie_multiclass_256x256.tflite model file for background …
EnricoSchw Mar 19, 2026
0ba6485
fix: update modelPath to use selfie_segmenter_landscape.tflite instea…
EnricoSchw Mar 19, 2026
17838c1
chore: update .gitattributes to mark ML model files as binary
EnricoSchw Mar 19, 2026
c280fe5
fix: update modelPath to use selfie_multiclass_256x256.tflite in Back…
EnricoSchw Mar 19, 2026
28851f7
chore: remove testBackgroundEffects.html and related webpack config, …
EnricoSchw Mar 19, 2026
e9caa9d
fix: ensure proper null check for segmenterInitPromise in frameProcessor
EnricoSchw Mar 19, 2026
94d4193
chore: remove HtmlWebpackPlugin and update webpack plugins with HMR a…
EnricoSchw Mar 19, 2026
d7bec4c
fix: check team feature status for conference calling in TeamState
EnricoSchw Mar 19, 2026
8bbc211
test: add unit tests for FrameSource and BackgroundEffectsController
EnricoSchw Mar 20, 2026
407b86f
Merge remote-tracking branch 'origin' into feat/background-effects-WP…
EnricoSchw Mar 20, 2026
269e0d6
feat: update UI of video background settings (#20807)
zskhan Mar 23, 2026
195238e
feat: add PerformancePanel component for monitoring and configuring […
EnricoSchw Mar 23, 2026
baba297
feat: add `getCurrentModelPath` to pipelines and handle model changes…
EnricoSchw Mar 24, 2026
093355e
feat: add icons, replace knockout observable with zustand [WPB-24166]…
zskhan Mar 24, 2026
2d6bc84
Merge remote-tracking branch 'origin/feat/background-effects-WPB-2325…
EnricoSchw Mar 24, 2026
55c9c27
feat: update background images
zskhan Mar 24, 2026
cb0b6d5
feat: update background images
zskhan Mar 24, 2026
15f710e
feat: add model state management and propagate model updates across B…
EnricoSchw Mar 24, 2026
730a2dc
feat: add pendingModelPath and improve segmenter initialization handl…
EnricoSchw Mar 25, 2026
f224d63
fix: ensure segmenter and model states are reset when initialization …
EnricoSchw Mar 25, 2026
36b10d0
fix: fix the glitch between switching the effects
zskhan Mar 25, 2026
c348ec7
chore: remove unused model state handling and obsolete comments in Pe…
EnricoSchw Mar 25, 2026
d3f37fc
test: update tests
zskhan Mar 25, 2026
768ad10
fix: oops
zskhan Mar 25, 2026
69af44c
Merge pull request #20848 from wireapp/feat/show-background-images
zskhan Mar 25, 2026
d814f23
feat: enhance error handling and introduce fatal error state in Backg…
EnricoSchw Mar 25, 2026
7090a5f
Merge remote-tracking branch 'origin/feat/background-effects-WPB-2325…
EnricoSchw Mar 25, 2026
25f0bc5
fix: update conference calling feature check to use team feature status
EnricoSchw Mar 25, 2026
9ce559a
Merge remote-tracking branch 'origin' into feat/background-effects-WP…
zskhan Mar 26, 2026
33da6c2
Merge branch 'feat/background-effects-WPB-23253' into fix/test-backgr…
zskhan Mar 26, 2026
8d4ceb6
fix: rename Util/LocalizerUtil to Util/localizerUtil and some minor f…
zskhan Mar 26, 2026
a949164
Merge pull request #20858 from wireapp/fix/test-background-effects-pr…
zskhan Mar 26, 2026
fa516e0
chore: rename files and folders in camelCase
zskhan Mar 26, 2026
622991d
chore: rename files and folders in camelCase
zskhan Mar 26, 2026
434b3d7
Merge pull request #20864 from wireapp/feat/rename-worker-state
zskhan Mar 26, 2026
49268f3
feat: generate types
zskhan Mar 26, 2026
f15a654
fix: typo
zskhan Mar 26, 2026
ab0f26c
Merge branch 'dev' into feat/background-effects-WPB-23253
zskhan Mar 30, 2026
1c957e1
Merge remote-tracking branch 'origin' into feat/background-effects-WP…
zskhan Mar 31, 2026
b1dc2fe
Merge remote-tracking branch 'origin' into feat/background-effects-WP…
zskhan Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@
*.ttf binary
*.woff binary
*.woff2 binary
# Machine Learning Models
*.tflite binary
*.onnx binary
*.pb binary
*.pt binary
6 changes: 6 additions & 0 deletions .ls-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ ls:
.ts: camelCase
.tsx: camelCase
.test.tsx: camelCase
apps/webapp/src/script/repositories/media/backgroundEffects:
.dir: camelCase
.ts: camelCase
.tsx: camelCase
.test.tsx: camelCase
.types.ts: camelCase
apps/webapp/src/script/repositories/assets:
.dir: camelCase
.ts: camelCase
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
20 changes: 20 additions & 0 deletions apps/webapp/src/i18n/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -2032,8 +2032,28 @@
"verify.headline": "You’ve got mail",
"verify.resendCode": "Resend code",
"verify.subhead": "Enter the six-digit verification code we sent to{newline}{email}",
"videoCallBackgroundAdd": "Add background...",
"videoCallBackgroundBlurHigh": "High",
"videoCallBackgroundBlurLow": "Low",
"videoCallBackgroundBlurSectionLabel": "Blur",
"videoCallBackgroundEffectsLabel": "Background Settings",
"videoCallBackgroundEnableHighQualityBlur": "Enable high quality blur",
"videoCallBackgroundNoEffect": "No background effect",
"videoCallBackgroundNone": "None",
"videoCallBackgroundOffice1": "Office 1",
"videoCallBackgroundOffice2": "Office 2",
"videoCallBackgroundOffice3": "Office 3",
"videoCallBackgroundOffice4": "Office 4",
"videoCallBackgroundOffice5": "Office 5",
"videoCallBackgroundSettings": "Background Settings",
"videoCallBackgroundUpload": "Upload background",
"videoCallBackgroundVirtual": "Virtual Background",
"videoCallBackgroundVirtualSectionLabel": "Virtual Backgrounds",
"videoCallBackgroundWire1": "Wire 1",
"videoCallBackgroundsLabel": "Backgrounds",
"videoCallMenuMoreAddReaction": "Add reaction",
"videoCallMenuMoreAudioSettings": "Audio Settings",
"videoCallMenuMoreCameraSettings": "Camera Settings",
"videoCallMenuMoreChangeView": "Change view",
"videoCallMenuMoreCloseReactions": "Close reactions",
"videoCallMenuMoreHideParticipants": "Hide participants",
Expand Down
16 changes: 16 additions & 0 deletions apps/webapp/src/script/auth/util/test/TestUtil.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,12 @@ import sk from 'I18n/sk-SK.json';
import sl from 'I18n/sl-SI.json';
import tr from 'I18n/tr-TR.json';
import uk from 'I18n/uk-UA.json';
import {CallingRepository} from 'Repositories/calling/CallingRepository';
import {Participant} from 'Repositories/calling/Participant';
import {Conversation} from 'Repositories/entity/Conversation';
import {User} from 'Repositories/entity/User';
import {BackgroundEffectsController} from 'Repositories/media/backgroundEffects/effects/backgroundEffectsController';
import {BackgroundEffectsHandler} from 'Repositories/media/backgroundEffectsHandler';
import {MediaDevicesHandler} from 'Repositories/media/MediaDevicesHandler';
import {setStrings} from 'Util/localizerUtil';
import {createUuid} from 'Util/uuid';
Expand Down Expand Up @@ -190,3 +193,16 @@ export const buildMediaDevicesHandler = () => {
setOnMediaDevicesRefreshHandler: jest.fn(),
} as unknown as MediaDevicesHandler;
};

export const buildCallingRepository = () => {
const controller: BackgroundEffectsController = {
getQuality: jest.fn(),
getCapabilityInfo: jest.fn(),
} as unknown as BackgroundEffectsController;
const backgroundEffectsHandler = new BackgroundEffectsHandler(controller);

return {
getBackgroundEffectsHandler: () => backgroundEffectsHandler,
isSuperhighQualityTierAllowed: jest.fn(),
} as unknown as CallingRepository;
};
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
const wrapperRef = useRef(null);
const [avsDebuggerEnabled, setAvsDebuggerEnabled] = useState(!!window.wire?.app?.debug?.isEnabledAvsDebugger());
const [avsRustSftEnabled, setAvsRustSftEnabled] = useState(!!window.wire?.app?.debug?.isEnabledAvsRustSFT());
const [videoBackgroundEffectsFeatureEnabled, setVideoBackgroundEffectsFeatureEnabled] = useState(
!!window.wire?.app?.debug?.isVideoBackgroundEffectsFeatureEnabled(),
);
const [coreCryptoLevel, setCoreCryptoLevel] = useState<CoreCryptoLogLevel>(CoreCryptoLogLevel.Info);

// Toggle config tool on 'cmd/ctrl + shift + 2'
Expand Down Expand Up @@ -219,6 +222,24 @@
);
};

const handleBackgroundEffectsFeature = (isChecked: boolean) => {
setVideoBackgroundEffectsFeatureEnabled(!!window.wire?.app?.debug?.enableVideoBackgroundEffectsFeature(isChecked));

Check warning on line 226 in apps/webapp/src/script/components/ConfigToolbar/ConfigToolbar.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Prefer `globalThis` over `window`.

See more on https://sonarcloud.io/project/issues?id=wireapp_wire-webapp&issues=AZz8vYuGr2yL4kQcdnWm&open=AZz8vYuGr2yL4kQcdnWm&pullRequest=20732
};
const renderBackgroundEffectsFeatureSelect = () => {
return (
<div style={{marginBottom: '10px'}}>
<label htmlFor="video-background-effects-feature-checkbox" style={{display: 'block', fontWeight: 'bold'}}>
ENABLE VIDEO BACKGROUND EFFECTS
</label>
<Switch
id="video-background-effects-feature-checkbox"
checked={videoBackgroundEffectsFeatureEnabled}
onToggle={isChecked => handleBackgroundEffectsFeature(isChecked)}
/>
</div>
);
};

const renderGzipSwitch = () => {
return (
<div style={{marginBottom: '10px'}}>
Expand Down Expand Up @@ -318,6 +339,10 @@

<hr />

<div>{renderBackgroundEffectsFeatureSelect()}</div>

<hr />

<div>{renderGzipSwitch()}</div>

<hr />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ const CallingContainer = ({
switchCameraInput={switchCameraInput}
switchMicrophoneInput={switchMicrophoneInput}
switchSpeakerOutput={switchSpeakerOutput}
switchBlurredBackground={status => callingRepository.switchVideoBackgroundBlur(status)}
switchVideoBackgroundEffect={effect => callingRepository.switchVideoBackgroundEffect(effect)}
setMaximizedParticipant={setMaximizedParticipant}
setActiveCallViewTab={setActiveCallViewTab}
toggleMute={toggleMute}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,27 @@
*
*/

import React, {useEffect, useState} from 'react';
import {ChangeEvent, useEffect, useState} from 'react';

import {DefaultConversationRoleName} from '@wireapp/api-client/lib/conversation/';
import cx from 'classnames';
import {container} from 'tsyringe';

import {
TabIndex,
Checkbox,
CheckboxLabel,
CloseDetachedWindowIcon,
IconButton,
IconButtonVariant,
OpenDetachedWindowIcon,
QUERY,
TabIndex,
} from '@wireapp/react-ui-kit';
import {WebAppEvents} from '@wireapp/webapp-events';

import {useAppNotification} from 'Components/AppNotification/AppNotification';
import {useCallAlertState} from 'Components/calling/useCallAlertState';
import {VideoBackgroundPerformancePanel} from 'Components/calling/VideoControls/videoBackgroundPerformancePanel/videoBackgroundPerformancePanel';
import {ConversationClassifiedBar} from 'Components/ClassifiedBar/ClassifiedBar';
import * as Icon from 'Components/Icon';
import {ModalComponent} from 'Components/Modals/ModalComponent';
Expand All @@ -47,6 +48,9 @@ import {Participant} from 'Repositories/calling/Participant';
import type {Grid} from 'Repositories/calling/videoGridHandler';
import type {Conversation} from 'Repositories/entity/Conversation';
import {MediaDevicesHandler} from 'Repositories/media/MediaDevicesHandler';
import {useBackgroundEffectsStore} from 'Repositories/media/useBackgroundEffectsStore';
import type {BackgroundEffectSelection} from 'Repositories/media/VideoBackgroundEffects';
import {BUILTIN_BACKGROUNDS} from 'Repositories/media/VideoBackgroundEffects';
import {PropertiesRepository} from 'Repositories/properties/PropertiesRepository';
import {TeamState} from 'Repositories/team/TeamState';
import {useActiveWindowMatchMedia} from 'src/script/hooks/useActiveWindowMatchMedia';
Expand All @@ -63,14 +67,15 @@ import {Duration} from './Duration';
import {
classifiedBarStyles,
headerActionsWrapperStyles,
paginationWrapperStyles,
videoTopBarStyles,
minimizeButtonStyles,
openDetachedWindowButtonStyles,
paginationStyles,
paginationWrapperStyles,
videoTopBarStyles,
} from './FullscreenVideoCall.styles';
import {GroupVideoGrid} from './GroupVideoGrid';
import {Pagination} from './Pagination/Pagination';
import {VideoBackgroundSettings} from './VideoControls/VideoBackgroundSettings/VideoBackgroundSettings';
import {VideoControls} from './VideoControls/VideoControls';

import {useWarningsState} from '../../view_model/WarningsContainer/WarningsState';
Expand All @@ -95,7 +100,7 @@ export interface FullscreenVideoCallProps {
switchCameraInput: (deviceId: string) => void;
switchMicrophoneInput: (deviceId: string) => void;
switchSpeakerOutput: (deviceId: string) => void;
switchBlurredBackground: (status: boolean) => void;
switchVideoBackgroundEffect: (effect: BackgroundEffectSelection) => void;
teamState?: TeamState;
callState?: CallState;
toggleCamera: (call: Call) => void;
Expand Down Expand Up @@ -125,7 +130,7 @@ const FullscreenVideoCall = ({
switchCameraInput,
switchMicrophoneInput,
switchSpeakerOutput,
switchBlurredBackground,
switchVideoBackgroundEffect,
setMaximizedParticipant,
setActiveCallViewTab,
toggleMute,
Expand Down Expand Up @@ -189,6 +194,7 @@ const FullscreenVideoCall = ({
const openPopup = () => callingRepository.setViewModeDetached();

const [isParticipantsListOpen, toggleParticipantsList] = useToggleState(false);
const [isBackgroundSidebarOpen, setIsBackgroundSidebarOpen] = useState(false);

const callNotification = useAppNotification({
activeWindow: viewMode === CallingViewMode.DETACHED_WINDOW ? detachedWindow! : window,
Expand Down Expand Up @@ -276,6 +282,17 @@ const FullscreenVideoCall = ({
const isPaginationVisible = !maximizedParticipant && activeCallViewTab === CallViewTab.ALL && totalPages > 1;

const isModerator = selfUser && roles[selfUser.id] === DefaultConversationRoleName.WIRE_ADMIN;
const backgroundEffectsHandler = callingRepository.getBackgroundEffectsHandler();

const selectedBackgroundEffect = useBackgroundEffectsStore(state => state.preferredEffect);

const handleBackgroundSidebarSelect = (effect: BackgroundEffectSelection) => {
void switchVideoBackgroundEffect(effect);
};

const handleEnableHighQualityBlur = (event: ChangeEvent<HTMLInputElement>) => {
callingRepository.allowSuperhighQualityTier(event.target.checked);
};

return (
<div
Expand Down Expand Up @@ -395,6 +412,16 @@ const FullscreenVideoCall = ({
onClose={toggleParticipantsList}
/>
)}
{isMobile && isBackgroundSidebarOpen && (
<VideoBackgroundSettings
selectedEffect={selectedBackgroundEffect}
backgrounds={BUILTIN_BACKGROUNDS}
onSelectEffect={handleBackgroundSidebarSelect}
onEnableHighQualityBlur={handleEnableHighQualityBlur}
onClose={() => setIsBackgroundSidebarOpen(false)}
highQualityBlurAllowed={callingRepository.isSuperhighQualityTierAllowed()}
/>
)}
</div>

{isMobile && isPaginationVisible && (
Expand Down Expand Up @@ -445,11 +472,12 @@ const FullscreenVideoCall = ({
toggleIsHandRaised={toggleIsHandRaised}
switchMicrophoneInput={switchMicrophoneInput}
switchSpeakerOutput={switchSpeakerOutput}
switchBlurredBackground={switchBlurredBackground}
switchVideoBackgroundEffect={switchVideoBackgroundEffect}
switchCameraInput={switchCameraInput}
setActiveCallViewTab={setActiveCallViewTab}
setMaximizedParticipant={setMaximizedParticipant}
sendEmoji={sendEmoji}
onOpenBackgroundSettings={() => setIsBackgroundSidebarOpen(true)}
/>
</>
)}
Expand All @@ -466,6 +494,16 @@ const FullscreenVideoCall = ({
onClose={toggleParticipantsList}
/>
)}
{!isMobile && isBackgroundSidebarOpen && (
<VideoBackgroundSettings
selectedEffect={selectedBackgroundEffect}
backgrounds={BUILTIN_BACKGROUNDS}
onSelectEffect={handleBackgroundSidebarSelect}
onEnableHighQualityBlur={handleEnableHighQualityBlur}
onClose={() => setIsBackgroundSidebarOpen(false)}
highQualityBlurAllowed={callingRepository.isSuperhighQualityTierAllowed()}
/>
)}
<ModalComponent
isShown={isConfirmCloseModalOpen}
onClosed={() => setIsConfirmCloseModalOpen(false)}
Expand All @@ -490,7 +528,7 @@ const FullscreenVideoCall = ({
wrapperCSS={{marginTop: 16}}
data-uie-name="do-not-ask-again-checkbox"
id="do-not-ask-again-checkbox"
onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
onChange={(event: ChangeEvent<HTMLInputElement>) =>
localStorage.setItem(
LOCAL_STORAGE_KEY_FOR_SCREEN_SHARING_CONFIRM_MODAL,
event.target.checked.toString(),
Expand Down Expand Up @@ -535,6 +573,7 @@ const FullscreenVideoCall = ({
</>
)}
</ModalComponent>
<VideoBackgroundPerformancePanel backgroundEffectsHandler={backgroundEffectsHandler} />
</div>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ const GroupVideoGrid = ({
'hasActiveVideo',
'sharesScreen',
'videoStream',
'blurredVideoStream',
'processedVideoStream',
]);

const [rowsAndColumns, setRowsAndColumns] = useState<RowsAndColumns>(
Expand Down Expand Up @@ -287,7 +287,7 @@ const GroupVideoGrid = ({
css={{
transform: thumbnail.hasActiveVideo && !thumbnail.sharesScreen ? 'rotateY(180deg)' : 'initial',
}}
srcObject={thumbnail.blurredVideoStream?.stream ?? thumbnail.videoStream}
srcObject={thumbnail.processedVideoStream?.stream ?? thumbnail.videoStream}
/>
{selfIsMuted && !minimized && (
<span className="group-video-grid__element__label__icon" data-uie-name="status-call-audio-muted">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,15 @@ const GroupVideoGridTile = ({
videoState,
handRaisedAt,
videoStream,
blurredVideoStream,
processedVideoStream,
isActivelySpeaking,
isAudioEstablished,
isSwitchingVideoResolution,
} = useKoSubscribableChildren(participant, [
'isMuted',
'handRaisedAt',
'videoStream',
'blurredVideoStream',
'processedVideoStream',
'isActivelySpeaking',
'videoState',
'isAudioEstablished',
Expand Down Expand Up @@ -142,7 +142,7 @@ const GroupVideoGridTile = ({
see https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide.
*/
muted
srcObject={blurredVideoStream?.stream ?? videoStream}
srcObject={processedVideoStream?.stream ?? videoStream}
className="group-video-grid__element-video"
css={groupVideoElementVideo(isMaximized || sharesScreen, participant === selfParticipant && sharesCamera)}
/>
Expand Down
Loading
Loading