Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F118446799
D3520.1775818194.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
9 KB
Referenced Files
None
Subscribers
None
D3520.1775818194.diff
View Options
diff --git a/src/resources/js/meet/client.js b/src/resources/js/meet/client.js
--- a/src/resources/js/meet/client.js
+++ b/src/resources/js/meet/client.js
@@ -46,85 +46,87 @@
* Sample statistics
*/
this.getStats = async () => {
- let consumerStats = {};
+ let consumerStats = {}
for (const consumer of Object.values(consumers)) {
const stats = await consumer.getStats()
const peerId = consumer.peerId
const peer = peers.self && peers.self.id === peerId ? peers.self : peers[peerId]
- const name = peer ? peer['nickname'] : ""
- const entryName = name + ":" + consumer.id
+ const name = peer ? peer.nickname : ''
+ const entryName = name + ':' + consumer.id
+
stats.forEach((stat) => {
- if (stat["type"] == "inbound-rtp") {
- if (stat["kind"] == "video") {
- //There should only be one matching entry
+ if (stat.type == 'inbound-rtp') {
+ if (stat.kind == 'video') {
+ // There should only be one matching entry
console.assert(!(entryName in consumerStats))
consumerStats[entryName] = stat
- consumerStats[entryName]['activeLayers'] = consumerActiveLayers[consumer.id]
- consumerStats[entryName]['score'] = consumerScore[consumer.id]
+ consumerStats[entryName].activeLayers = consumerActiveLayers[consumer.id]
+ consumerStats[entryName].score = consumerScore[consumer.id]
}
}
})
}
- let sendTransportStats = {};
+ let sendTransportStats = {}
if (sendTransport) {
(await sendTransport.getStats()).forEach((stat) => {
- if (stat["type"] == "outbound-rtp") {
- const entryName = stat["kind"] + ":" + stat["id"]
+ if (stat.type == 'outbound-rtp') {
+ const entryName = stat.kind + ':' + stat.id
sendTransportStats[entryName] = stat
}
})
}
- let receiveTransportStats = {};
+ let receiveTransportStats = {}
if (recvTransport) {
(await recvTransport.getStats()).forEach((stat) => {
- if (stat["type"] == "inbound-rtp") {
- //NOTE: The inbound-rtp stats with ssrc 1234 are RtpProbator, which is used for REMB (you'll see a lot of PLI's for it)
- const entryName = stat["kind"] + ":" + stat["id"]
+ if (stat.type == 'inbound-rtp') {
+ // NOTE: The inbound-rtp stats with ssrc 1234 are RtpProbator,
+ // which is used for REMB (you'll see a lot of PLI's for it)
+ const entryName = stat.kind + ':' + stat.id
receiveTransportStats[entryName] = stat
}
})
}
- let camProducerStats = {};
+ let camProducerStats = {}
if (camProducer) {
(await camProducer.getStats()).forEach((stat) => {
- if (stat["type"] == "outbound-rtp") {
- camProducerStats[stat["id"]] = stat
+ if (stat.type == 'outbound-rtp') {
+ camProducerStats[stat.id] = stat
}
})
}
- let micProducerStats = {};
+ let micProducerStats = {}
if (micProducer) {
(await micProducer.getStats()).forEach((stat) => {
- if (stat["type"] == "outbound-rtp") {
- micProducerStats[stat["id"]] = stat
+ if (stat.type == 'outbound-rtp') {
+ micProducerStats[stat.id] = stat
}
})
}
- let screenProducerStats = {};
+ let screenProducerStats = {}
if (screenProducer) {
(await screenProducer.getStats()).forEach((stat) => {
- if (stat["type"] == "outbound-rtp") {
- screenProducerStats[stat["id"]] = stat
+ if (stat.type == 'outbound-rtp') {
+ screenProducerStats[stat.id] = stat
}
})
}
return {
- 'roomId': roomId,
- 'sendTransportState': sendTransport ? sendTransport.connectionState : "undefined",
- 'sendTransportStats': sendTransportStats,
- 'receiveTransportState': recvTransport ? recvTransport.connectionState : "undefined",
- 'receiveTransportStats': receiveTransportStats,
- 'camProducerStats': camProducerStats,
- 'micProducerStats': micProducerStats,
- 'screenProducerStats': screenProducerStats,
- 'consumerStats': consumerStats,
- };
+ roomId,
+ sendTransportStats,
+ receiveTransportStats,
+ camProducerStats,
+ micProducerStats,
+ screenProducerStats,
+ consumerStats,
+ 'receiveTransportState': recvTransport ? recvTransport.connectionState : 'undefined',
+ 'sendTransportState': sendTransport ? sendTransport.connectionState : 'undefined'
+ }
}
/**
@@ -167,12 +169,8 @@
// Remove peers' video elements
Object.values(peers).forEach(peer => {
- if (peer.videoElement) {
- $(peer.videoElement).remove()
- }
- if (peer.screenVideoElement) {
- $(peer.screenVideoElement).remove()
- }
+ media.resetVideoElement(peer.videoElement, true)
+ media.resetVideoElement(peer.screenVideoElement, true)
})
// Reset state
@@ -465,7 +463,6 @@
})
socket.on('notification', (notification) => {
- console.warn("notification", notification)
switch (notification.method) {
case 'roomReady':
iceServers = notification.data.iceServers
@@ -574,13 +571,13 @@
case 'consumerScoreChanged': {
const { consumerId, score } = notification.data
- consumerScore[consumerId] = score;
+ consumerScore[consumerId] = score
return
}
case 'consumerLayersChanged': {
const { consumerId, layers } = notification.data
- consumerActiveLayers[consumerId] = layers;
+ consumerActiveLayers[consumerId] = layers
return
}
@@ -746,7 +743,7 @@
// the peer. If we do not do this we have to wait about 20 seconds for repeated
// newConsumer requests
Object.keys(consumers).forEach(cid => {
- const consumer = consumers[cid];
+ const consumer = consumers[cid]
if (consumer.peerId === peer.id) {
(consumer.source == 'screen' ? screenTracks : tracks).push(consumer.track)
}
@@ -827,7 +824,7 @@
// Workaround the firefox screenshare issue.
// With this we effectively limit ourselves to 640 width
- await camProducer.setMaxSpatialLayer(1);
+ await camProducer.setMaxSpatialLayer(1)
camProducer.on('transportclose', () => {
camProducer = null
diff --git a/src/resources/js/meet/media.js b/src/resources/js/meet/media.js
--- a/src/resources/js/meet/media.js
+++ b/src/resources/js/meet/media.js
@@ -75,6 +75,9 @@
return stream.getVideoTracks()[0]
}
+ /**
+ * Creates a <video> element with media stream/tracks assigned
+ */
this.createVideoElement = (tracks, props) => {
const videoElement = document.createElement('video')
@@ -89,6 +92,28 @@
return videoElement
}
+ /**
+ * Resets a <video> element media streams
+ */
+ this.resetVideoElement = (element, remove) => {
+ if (!element) {
+ return
+ }
+
+ const stream = element.srcObject
+
+ if (stream) {
+ stream.getTracks().forEach(track => {
+ track.stop()
+ stream.removeTrack(track)
+ })
+ }
+
+ if (remove) {
+ element.remove()
+ }
+ }
+
/**
* Make a picture from a video element
*/
@@ -110,7 +135,7 @@
let dh = Math.min(sh, maxSize)
let dw = sh < maxSize ? sw : Math.floor(sw * dh/sh)
- const canvas = $("<canvas>")[0]
+ const canvas = document.createElement('canvas')
canvas.width = dw
canvas.height = dh
@@ -211,11 +236,8 @@
this.setupStop = () => {
volumeMeterStop()
- // Unset the video element tracks
- if (setupVideoElement) {
- const mediaStream = new MediaStream()
- setupVideoElement.srcObject = mediaStream
- }
+ // Unset the video element tracks, if any set
+ this.resetVideoElement(setupVideoElement)
}
/**
diff --git a/src/resources/vue/CompanionApp.vue b/src/resources/vue/CompanionApp.vue
--- a/src/resources/vue/CompanionApp.vue
+++ b/src/resources/vue/CompanionApp.vue
@@ -3,8 +3,8 @@
<div class="card">
<div class="card-body">
<div class="card-title">
- <small><sup class="badge bg-primary">{{ $t('dashboard.beta') }}</sup></small>
{{ $t('companion.title') }}
+ <small><sup class="badge bg-primary">{{ $t('dashboard.beta') }}</sup></small>
</div>
<div class="card-text">
<p>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 10, 10:49 AM (1 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18852310
Default Alt Text
D3520.1775818194.diff (9 KB)
Attached To
Mode
D3520: Meet: Fix releasing media streams, CS fixes
Attached
Detach File
Event Timeline