diff --git a/package-lock.json b/package-lock.json index 26f7c0ceeac..5c9fd29923a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4789,11 +4789,27 @@ "vue-template-es2015-compiler": "^1.9.0" }, "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } }, @@ -8944,6 +8960,24 @@ "lru-cache": "^4.1.5", "semver": "^5.6.0", "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } } }, "ee-first": { @@ -13797,13 +13831,11 @@ "dev": true }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^4.0.0" } }, "make-dir": { @@ -22100,10 +22132,9 @@ "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.0", diff --git a/package.json b/package.json index af2d39a3909..553d39e5e47 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "escape-html": "^1.0.3", "hark": "^1.2.3", "lodash": "^4.17.20", + "lru-cache": "^6.0.0", "mockconsole": "0.0.1", "nextcloud-vue-collections": "^0.9.0", "sdp-transform": "^2.14.1", diff --git a/src/components/CallView/shared/VideoBackground.vue b/src/components/CallView/shared/VideoBackground.vue index e75325c66c6..410a0167397 100644 --- a/src/components/CallView/shared/VideoBackground.vue +++ b/src/components/CallView/shared/VideoBackground.vue @@ -97,7 +97,6 @@ export default { useCssBlurFilter: true, blur: 0, blurredBackgroundImage: null, - blurredBackgroundImageCache: {}, blurredBackgroundImageSource: null, pendingGenerateBlurredBackgroundImageCount: 0, isDestroyed: false, @@ -150,6 +149,17 @@ export default { return this.backgroundBlur }, + blurredBackgroundImageCache() { + if (!this.user) { + return null + } + + if (!this.$store.getters.getBlurredBackgroundImageCache(this.user)) { + this.$store.dispatch('initializeBlurredBackgroundImageCache', this.user) + } + + return this.$store.getters.getBlurredBackgroundImageCache(this.user) + }, }, watch: { @@ -254,8 +264,8 @@ export default { } const cacheId = this.backgroundImageUrl + '-' + width + '-' + height + '-' + this.backgroundBlur - if (this.blurredBackgroundImageCache[cacheId]) { - this.blurredBackgroundImage = this.blurredBackgroundImageCache[cacheId] + if (this.blurredBackgroundImageCache.get(cacheId)) { + this.blurredBackgroundImage = this.blurredBackgroundImageCache.get(cacheId) return } @@ -274,7 +284,7 @@ export default { } this.blurredBackgroundImage = image - this.blurredBackgroundImageCache[cacheId] = this.blurredBackgroundImage + this.blurredBackgroundImageCache.set(cacheId, this.blurredBackgroundImage) const generateBlurredBackgroundImageCalledAgain = this.pendingGenerateBlurredBackgroundImageCount > 1 diff --git a/src/store/callViewStore.js b/src/store/callViewStore.js index 2518c71094d..8353f6bd41e 100644 --- a/src/store/callViewStore.js +++ b/src/store/callViewStore.js @@ -26,6 +26,8 @@ import { CONVERSATION, } from '../constants' +const LRU = require('lru-cache') + const state = { isGrid: false, isStripeOpen: true, @@ -35,6 +37,7 @@ const state = { selectedVideoPeerId: null, videoBackgroundBlur: 1, participantRaisedHands: {}, + blurredBackgroundImageCache: {}, } const getters = { @@ -54,6 +57,7 @@ const getters = { return (width * height * state.videoBackgroundBlur) / 1000 }, isParticipantRaisedHand: (state) => (peerId) => !!state.participantRaisedHands[peerId], + getBlurredBackgroundImageCache: (state) => (videoBackgroundId) => state.blurredBackgroundImageCache[videoBackgroundId], } const mutations = { @@ -86,6 +90,16 @@ const mutations = { clearParticipantHandRaised(state) { state.participantRaisedHands = {} }, + initializeBlurredBackgroundImageCache(state, videoBackgroundId) { + if (state.blurredBackgroundImageCache[videoBackgroundId]) { + return + } + + Vue.set(state.blurredBackgroundImageCache, videoBackgroundId, new LRU({ max: 10 })) + }, + clearBlurredBackgroundImageCache(state) { + state.blurredBackgroundImageCache = {} + }, } const actions = { @@ -116,6 +130,8 @@ const actions = { leaveCall(context) { // clear raised hands as they were specific to the call context.commit('clearParticipantHandRaised') + + context.commit('clearBlurredBackgroundImageCache') }, /** @@ -197,6 +213,10 @@ const actions = { }) context.commit('presentationStarted', false) }, + + initializeBlurredBackgroundImageCache(context, videoBackgroundId) { + context.commit('initializeBlurredBackgroundImageCache', videoBackgroundId) + }, } export default { state, mutations, getters, actions }