summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js
parentInitial commit. (diff)
downloadfirefox-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.js70
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');