Skip to content

Commit 01c813b

Browse files
committed
Refactor screenshare and media watermarking logic
- Remove unnecessary track generator methods in e2e-video-stats.js - Disable video timestamp watermarking in get-user-media.js - Enhance screenshare script with improved timestamp and slide handling - Update session handling for fake media and screenshare configuration
1 parent 7be9bad commit 01c813b

File tree

4 files changed

+75
-36
lines changed

4 files changed

+75
-36
lines changed

scripts/e2e-video-stats.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,6 @@ webrtcperf.applyVideoTimestampWatermark = mediaStream => {
151151

152152
const trackProcessor = new window.MediaStreamTrackProcessor({ track })
153153
const trackGenerator = new window.MediaStreamTrackGenerator({ kind: 'video' })
154-
trackGenerator.getSettings = () => trackSettings
155-
trackGenerator.getConstraints = () => trackConstraints
156-
trackGenerator.applyConstraints = async () => {}
157154
track.addEventListener('ended', () => {
158155
trackGenerator.close()
159156
trackProcessor.close()

scripts/get-user-media.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,6 @@ if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
238238
if (webrtcperf.enabledForSession(webrtcperf.params.timestampWatermarkAudio)) {
239239
mediaStream = webrtcperf.applyAudioTimestampWatermark(mediaStream)
240240
}
241-
if (webrtcperf.enabledForSession(webrtcperf.params.timestampWatermarkVideo)) {
242-
mediaStream = webrtcperf.applyVideoTimestampWatermark(mediaStream)
243-
}
244241

245242
webrtcperf.collectMediaTracks(mediaStream)
246243
return mediaStream

scripts/screenshare.js

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,6 @@ webrtcperf.startFakeScreenshare = (
1515
if (document.querySelector('#webrtcperf-fake-screenshare')) {
1616
return
1717
}
18-
19-
const animateElement = async (el, direction) => {
20-
const slideIn = [
21-
{ transform: 'translateX(100%)', opacity: 0 },
22-
{ transform: 'translateX(0%)', opacity: 1 },
23-
]
24-
const slideOut = [
25-
{ transform: 'translateX(0%)', opacity: 1 },
26-
{ transform: 'translateX(-100%)', opacity: 0 },
27-
]
28-
return new Promise(resolve => {
29-
el.animate(direction === 'in' ? slideIn : slideOut, {
30-
duration: animationDuration,
31-
iterations: 1,
32-
fill: 'forwards',
33-
}).addEventListener('finish', () => resolve())
34-
})
35-
}
36-
const applyAnimation = async (el1, el2, delay) => {
37-
await Promise.all([animateElement(el1, 'out'), animateElement(el2, 'in')])
38-
await webrtcperf.sleep(delay)
39-
}
40-
4118
webrtcperf.log(
4219
`FakeScreenshare start: embed=${embed} slides=${slides} animationDuration=${animationDuration} delay=${delay} width=${width} height=${height}`,
4320
)
@@ -53,6 +30,7 @@ webrtcperf.startFakeScreenshare = (
5330
webrtcperf.GET_DISPLAY_MEDIA_CROP = '#webrtcperf-fake-screenshare'
5431
}
5532

33+
// Pointer animation.
5634
if (pointerAnimation) {
5735
const el = document.createElement('div')
5836
el.setAttribute(
@@ -74,6 +52,34 @@ webrtcperf.startFakeScreenshare = (
7452
)
7553
}
7654

55+
// Draw overlay with timestamp.
56+
let drawTimestamp = null
57+
if (webrtcperf.enabledForSession(webrtcperf.params.timestampWatermarkVideo)) {
58+
const canvas = document.createElement('canvas')
59+
const fontSize = Math.round(height / 18)
60+
const textHeight = Math.round(height / 15)
61+
canvas.width = width
62+
canvas.height = textHeight
63+
canvas.setAttribute(
64+
'style',
65+
`all: unset; position: absolute; top: 0; left: 0; z-index: 1; width: 100%; height: ${textHeight}px;`,
66+
)
67+
wrapper.appendChild(canvas)
68+
const ctx = canvas.getContext('2d')
69+
ctx.font = `${fontSize}px Noto Mono`
70+
ctx.textAlign = 'center'
71+
const participantNameIndex = parseInt(webrtcperf.getParticipantName().split('-')[1]) || 0
72+
drawTimestamp = () => {
73+
ctx.fillStyle = 'black'
74+
ctx.fillRect(0, 0, width, textHeight)
75+
ctx.fillStyle = 'white'
76+
const text = `${participantNameIndex}-${Date.now()}`
77+
ctx.fillText(text, width / 2, fontSize)
78+
}
79+
}
80+
81+
// Slides animation.
82+
let advanceSlide = null
7783
if (embed) {
7884
const el = document.createElement('iframe')
7985
el.setAttribute('src', embed)
@@ -82,7 +88,33 @@ webrtcperf.startFakeScreenshare = (
8288
el.setAttribute('style', 'padding: 0; margin: 0; border: none;')
8389
el.setAttribute('frameborder', '0')
8490
wrapper.appendChild(el)
91+
92+
advanceSlide = async () => {
93+
try {
94+
await window.keypressText('iframe', ' ') //0x24
95+
} catch (e) {
96+
console.error(e)
97+
}
98+
}
8599
} else {
100+
const animateElement = async (el, direction) => {
101+
const slideIn = [
102+
{ transform: 'translateX(100%)', opacity: 0 },
103+
{ transform: 'translateX(0%)', opacity: 1 },
104+
]
105+
const slideOut = [
106+
{ transform: 'translateX(0%)', opacity: 1 },
107+
{ transform: 'translateX(-100%)', opacity: 0 },
108+
]
109+
return new Promise(resolve => {
110+
el.animate(direction === 'in' ? slideIn : slideOut, {
111+
duration: animationDuration,
112+
iterations: 1,
113+
fill: 'forwards',
114+
}).addEventListener('finish', () => resolve())
115+
})
116+
}
117+
86118
const slidesElements = []
87119
for (let i = 0; i < slides; i++) {
88120
const img = document.createElement('img')
@@ -99,15 +131,20 @@ webrtcperf.startFakeScreenshare = (
99131
slidesElements.push(img)
100132
}
101133
let cur = 0
102-
const loopIteration = async () => {
103-
if (!document.querySelector('#webrtcperf-fake-screenshare')) return
134+
advanceSlide = async () => {
104135
const next = cur === slidesElements.length - 1 ? 0 : cur + 1
105-
await applyAnimation(slidesElements[cur], slidesElements[next], delay)
136+
await Promise.all([animateElement(slidesElements[cur], 'out'), animateElement(slidesElements[next], 'in')])
106137
cur = next
107-
setTimeout(() => loopIteration())
108138
}
109-
loopIteration()
110139
}
140+
141+
const loopIteration = async () => {
142+
if (!document.querySelector('#webrtcperf-fake-screenshare')) return
143+
if (drawTimestamp) drawTimestamp()
144+
if (advanceSlide) await advanceSlide()
145+
setTimeout(() => loopIteration(), delay)
146+
}
147+
loopIteration()
111148
}
112149

113150
webrtcperf.stopFakeScreenshare = () => {

src/session.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,7 @@ try {
776776
webrtcperf.params = {};
777777
}
778778
webrtcperf.GET_DISPLAY_MEDIA_TYPE = "${this.getDisplayMediaType}";
779-
webrtcperf.USE_FAKE_MEDIA = "${this.useFakeMedia}";
779+
webrtcperf.USE_FAKE_MEDIA = ${this.useFakeMedia};
780780
`
781781

782782
if (this.serverPort) {
@@ -1339,7 +1339,7 @@ webrtcperf.VIDEO_URL = "http${this.serverUseHttps ? 's' : ''}://localhost:${this
13391339
await page.exposeFunction('webrtcperf_sdpWrite', (sdp: sdpTransform.SessionDescription) => sdpTransform.write(sdp))
13401340

13411341
await page.exposeFunction('webrtcperf_startFakeScreenshare', async () => {
1342-
if (!this.browser || this.getDisplayMediaType === 'monitor') return
1342+
if (!this.browser) return
13431343
let screensharePage = page
13441344
if (!this.useFakeMedia) {
13451345
if (!this.screensharePage) {
@@ -1348,11 +1348,19 @@ webrtcperf.VIDEO_URL = "http${this.serverUseHttps ? 's' : ''}://localhost:${this
13481348
for (const name of ['scripts/common.js', 'scripts/screenshare.js']) {
13491349
await this.screensharePage.evaluateOnNewDocument(fs.readFileSync(resolvePackagePath(name), 'utf8'))
13501350
}
1351+
await this.screensharePage.exposeFunction(
1352+
'keypressText',
1353+
async (selector: string, text: string, delay = 20) => {
1354+
await page.type(selector, text, { delay })
1355+
},
1356+
)
13511357
await this.screensharePage.goto(
13521358
`http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/empty-page?auth=${this.serverSecret}&title=webrtcperf-screenshare`,
13531359
)
13541360
}
13551361
screensharePage = this.screensharePage
1362+
} else if (this.getDisplayMediaType === 'monitor') {
1363+
return
13561364
}
13571365
await screensharePage.evaluate(() => webrtcperf.startFakeScreenshare())
13581366
})

0 commit comments

Comments
 (0)