From 165fd50861deefc5b7df9de71e4567151e894295 Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Wed, 29 Nov 2023 10:11:22 +0100 Subject: [PATCH] e2ee: move setCodecPreferences out of videopipe --- .../endtoend-encryption/js/main.js | 29 +++++++++++++++++ .../endtoend-encryption/js/videopipe.js | 31 +------------------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/content/insertable-streams/endtoend-encryption/js/main.js b/src/content/insertable-streams/endtoend-encryption/js/main.js index 304ced712f..b4b20c9f2d 100644 --- a/src/content/insertable-streams/endtoend-encryption/js/main.js +++ b/src/content/insertable-streams/endtoend-encryption/js/main.js @@ -39,6 +39,14 @@ let localStream; // eslint-disable-next-line no-unused-vars let remoteStream; +// Preferring a certain codec is an expert option without GUI. +// Use opus by default. +// eslint-disable-next-line prefer-const +let preferredAudioCodecMimeType = 'audio/opus'; +// Use VP8 by default to limit depacketization issues. +// eslint-disable-next-line prefer-const +let preferredVideoCodecMimeType = 'video/VP8'; + let hasEnoughAPIs = !!window.RTCRtpScriptTransform; if (!hasEnoughAPIs) { @@ -141,6 +149,25 @@ function setupReceiverTransform(receiver) { }, [readable, writable]); } +function maybeSetCodecPreferences(trackEvent) { + if (!'setCodecPreferences' in window.RTCRtpTransceiver.prototype) return; + if (trackEvent.track.kind === 'audio' && preferredAudioCodecMimeType ) { + const {codecs} = RTCRtpReceiver.getCapabilities('audio'); + const selectedCodecIndex = codecs.findIndex(c => c.mimeType === preferredAudioCodecMimeType); + const selectedCodec = codecs[selectedCodecIndex]; + codecs.splice(selectedCodecIndex, 1); + codecs.unshift(selectedCodec); + trackEvent.transceiver.setCodecPreferences(codecs); + } else if (trackEvent.track.kind === 'video' && preferredVideoCodecMimeType) { + const {codecs} = RTCRtpReceiver.getCapabilities('video'); + const selectedCodecIndex = codecs.findIndex(c => c.mimeType === preferredVideoCodecMimeType); + const selectedCodec = codecs[selectedCodecIndex]; + codecs.splice(selectedCodecIndex, 1); + codecs.unshift(selectedCodec); + trackEvent.transceiver.setCodecPreferences(codecs); + } +} + function call() { callButton.disabled = true; hangupButton.disabled = false; @@ -151,6 +178,7 @@ function call() { // to both places. startToMiddle = new VideoPipe(localStream, true, false, e => { // Do not setup the receiver transform. + maybeSetCodecPreferences(e); videoMonitor.srcObject = e.streams[0]; }); startToMiddle.pc1.getSenders().forEach(setupSenderTransform); @@ -158,6 +186,7 @@ function call() { startToEnd = new VideoPipe(localStream, true, true, e => { setupReceiverTransform(e.receiver); + maybeSetCodecPreferences(e); gotRemoteStream(e.streams[0]); }); startToEnd.pc1.getSenders().forEach(setupSenderTransform); diff --git a/src/content/insertable-streams/endtoend-encryption/js/videopipe.js b/src/content/insertable-streams/endtoend-encryption/js/videopipe.js index 30e768da75..353fcd0ee7 100644 --- a/src/content/insertable-streams/endtoend-encryption/js/videopipe.js +++ b/src/content/insertable-streams/endtoend-encryption/js/videopipe.js @@ -21,14 +21,6 @@ // 'use strict'; -// Preferring a certain codec is an expert option without GUI. -// Use opus by default. -// eslint-disable-next-line prefer-const -let preferredAudioCodecMimeType = 'audio/opus'; -// Use VP8 by default to limit depacketization issues. -// eslint-disable-next-line prefer-const -let preferredVideoCodecMimeType = 'video/VP8'; - function VideoPipe(stream, forceSend, forceReceive, handler) { this.pc1 = new RTCPeerConnection({ encodedInsertableStreams: forceSend, @@ -36,28 +28,7 @@ function VideoPipe(stream, forceSend, forceReceive, handler) { this.pc2 = new RTCPeerConnection({ encodedInsertableStreams: forceReceive, }); - if ('setCodecPreferences' in window.RTCRtpTransceiver.prototype) { - this.pc2.ontrack = (e) => { - if (e.track.kind === 'audio' && preferredAudioCodecMimeType ) { - const {codecs} = RTCRtpReceiver.getCapabilities('audio'); - const selectedCodecIndex = codecs.findIndex(c => c.mimeType === preferredAudioCodecMimeType); - const selectedCodec = codecs[selectedCodecIndex]; - codecs.splice(selectedCodecIndex, 1); - codecs.unshift(selectedCodec); - e.transceiver.setCodecPreferences(codecs); - } else if (e.track.kind === 'video' && preferredVideoCodecMimeType) { - const {codecs} = RTCRtpReceiver.getCapabilities('video'); - const selectedCodecIndex = codecs.findIndex(c => c.mimeType === preferredVideoCodecMimeType); - const selectedCodec = codecs[selectedCodecIndex]; - codecs.splice(selectedCodecIndex, 1); - codecs.unshift(selectedCodec); - e.transceiver.setCodecPreferences(codecs); - } - handler(e); - }; - } else { - this.pc2.ontrack = handler; - } + this.pc2.ontrack = handler; stream.getTracks().forEach((track) => this.pc1.addTrack(track, stream)); }