diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js')
-rw-r--r-- | testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js new file mode 100644 index 0000000000..5e68ee1fb9 --- /dev/null +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js @@ -0,0 +1,70 @@ +onrtctransform = event => { + const transformer = event.transformer; + let keyFrameCount = 0; + let gotFrame; + + transformer.options.port.onmessage = event => { + const {method, rid} = event.data; + // Maybe refactor to have transaction ids? + if (method == 'generateKeyFrame') { + generateKeyFrame(rid); + } else if (method == 'waitForFrame') { + waitForFrame(); + } + } + + async function rejectInMs(timeout) { + return new Promise((_, reject) => { + const rejectWithTimeout = () => { + reject(new DOMException(`Timed out after waiting for ${timeout} ms`, + 'TimeoutError')); + }; + setTimeout(rejectWithTimeout, timeout); + }); + } + + async function generateKeyFrame(rid) { + try { + const timestamp = await Promise.race([transformer.generateKeyFrame(rid), rejectInMs(8000)]); + transformer.options.port.postMessage({result: 'success', value: timestamp, count: keyFrameCount}); + } catch (e) { + // TODO: This does not work if we send e.name, why? + transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`}); + } + } + + async function waitForFrame() { + try { + await Promise.race([new Promise(r => gotFrameCallback = r), rejectInMs(8000)]); + transformer.options.port.postMessage('got frame'); + } catch (e) { + // TODO: This does not work if we send e.name, why? + transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`}); + } + } + + transformer.options.port.postMessage('started'); + transformer.reader = transformer.readable.getReader(); + transformer.writer = transformer.writable.getWriter(); + + function process(transformer) + { + transformer.reader.read().then(chunk => { + if (chunk.done) + return; + if (chunk.value instanceof RTCEncodedVideoFrame) { + if (chunk.value.type == 'key') { + keyFrameCount++; + } + } + if (gotFrameCallback) { + gotFrameCallback(); + } + transformer.writer.write(chunk.value); + process(transformer); + }); + } + + process(transformer); +}; +self.postMessage('registered'); |