diff --git a/src/js/adapter_factory.js b/src/js/adapter_factory.js index 54bdda28..7ac2a71c 100644 --- a/src/js/adapter_factory.js +++ b/src/js/adapter_factory.js @@ -63,6 +63,7 @@ export function adapterFactory({window} = {}, options = { chromeShim.shimGetStats(window, browserDetails); chromeShim.shimSenderReceiverGetStats(window, browserDetails); chromeShim.fixNegotiationNeeded(window, browserDetails); + chromeShim.shimRTCRtpScriptTransform(window, browserDetails); commonShim.shimRTCIceCandidate(window, browserDetails); commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails); diff --git a/src/js/chrome/chrome_shim.js b/src/js/chrome/chrome_shim.js index 46aee7e2..ceae7f0c 100644 --- a/src/js/chrome/chrome_shim.js +++ b/src/js/chrome/chrome_shim.js @@ -700,3 +700,39 @@ export function fixNegotiationNeeded(window, browserDetails) { return e; }); } + +export function shimRTCRtpScriptTransform(window) { + if (!window.RTCRtpScriptTransform && + !('transform' in window.RTCRtpSender.prototype) && + !('transform' in window.RTCRtpReceiver.prototype)) { + window.RTCRtpScriptTransform = class RTCRtpScriptTransform { + constructor(worker, options, transfer) { + this._worker = worker; + this._options = options; + this._transfer = transfer; + } + }; + const prop = { + get() { + return this._transform || null; + }, + set(transform) { + if (transform && !(transform instanceof window.RTCRtpScriptTransform)) { + throw new TypeError('expected window.RTCRtpScriptTransform'); + } + this._transform = transform || null; + if (!transform) { + return; + } + const {readable, writable} = this.createEncodedStreams(); + transform._worker.postMessage({ + rtctransform: { + readable, writable, options: transform._options + } + }, [readable, writable, ...(transform._transfer || [])]); + } + }; + Object.defineProperty(window.RTCRtpSender.prototype, 'transform', prop); + Object.defineProperty(window.RTCRtpReceiver.prototype, 'transform', prop); + } +}