From bc02c86c91ad6bfeb58ef29e22c17773bc9fccf4 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 28 Feb 2022 14:16:50 -0800 Subject: [PATCH] common: use webrtc sdp. add webrtc signaling logging. settings mixin release. --- common/src/rtc-signaling.ts | 36 +++++++++++++++++++-------- common/src/settings-mixin.ts | 4 +-- common/src/wrtc-to-rtsp.ts | 48 ++++++++++++------------------------ 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/common/src/rtc-signaling.ts b/common/src/rtc-signaling.ts index b7fc55c67..770afa0b7 100644 --- a/common/src/rtc-signaling.ts +++ b/common/src/rtc-signaling.ts @@ -1,20 +1,36 @@ -import type { RTCSignalingSession, RTCAVSignalingSetup, ScryptedDevice, RTCSignalingChannel } from "@scrypted/sdk/types"; +import type { RTCSignalingSession, RTCAVSignalingSetup } from "@scrypted/sdk/types"; import type { RTCSignalingChannelOptions, RTCSignalingSendIceCandidate } from "@scrypted/sdk"; export async function startRTCSignalingSession(session: RTCSignalingSession, offer: RTCSessionDescriptionInit, + console: Console, createSetup: () => Promise, setRemoteDescription: (remoteDescription: RTCSessionDescriptionInit) => Promise, addIceCandidate?: (candidate: RTCIceCandidate) => Promise) { - const setup = await createSetup(); - if (!offer) { - const offer = await session.createLocalDescription('offer', setup, addIceCandidate); - const answer = await setRemoteDescription(offer); - await session.setRemoteDescription(answer, setup); + try { + const setup = await createSetup(); + console.log('offer', offer?.sdp, 'rtc setup', setup); + if (!offer) { + console.log('session.createLocalDescription'); + const offer = await session.createLocalDescription('offer', setup, addIceCandidate); + console.log('rtc offer', offer.sdp); + const answer = await setRemoteDescription(offer); + console.log('rtc answer', answer); + await session.setRemoteDescription(answer, setup); + console.log('session.setRemoteDescription done'); + } + else { + console.log('session.setRemoteDescription'); + await session.setRemoteDescription(offer, setup); + console.log('session.createLocalDescription'); + const answer = await session.createLocalDescription('answer', setup, addIceCandidate); + console.log('rtc answer', answer.sdp); + await setRemoteDescription(answer); + console.log('session.setRemoteDescription done'); + } } - else { - await session.setRemoteDescription(offer, setup); - const answer = await session.createLocalDescription('answer', setup, addIceCandidate); - await setRemoteDescription(answer); + catch (e) { + console.error('RTC signaling failed', e); + throw e; } } diff --git a/common/src/settings-mixin.ts b/common/src/settings-mixin.ts index ea3eebb3e..96207ba7d 100644 --- a/common/src/settings-mixin.ts +++ b/common/src/settings-mixin.ts @@ -84,7 +84,7 @@ export abstract class SettingsMixinDeviceBase extends MixinDeviceBase line.trim()); + const vindex = lines.findIndex(line => line.startsWith('m=video')); + lines.splice(vindex + 1, 0, 'a=control:trackID=video'); + const aindex = lines.findIndex(line => line.startsWith('m=audio')); + lines.splice(aindex + 1, 0, 'a=control:trackID=audio'); + outputSdp = lines.join('\r\n') + return outputSdp; } const useUdp = false; @@ -62,19 +48,17 @@ export async function createRTCPeerConnectionSource(channel: ScryptedDeviceBase const { clientPromise, port } = await listenZeroSingleClient(); - let ai: NodeJS.Timeout; - let vi: NodeJS.Timeout; + let pictureLossInterval: NodeJS.Timeout; let pc: RTCPeerConnection; let socket: Socket; // rtsp server must operate in udp forwarding mode to accomodate packet reordering. let udp = dgram.createSocket('udp4'); const cleanup = () => { - console.log('cleanup'); + console.log('webrtc/rtsp cleaning up'); pc?.close(); socket?.destroy(); - clearInterval(ai); - clearInterval(vi); + clearInterval(pictureLossInterval); try { udp.close(); } @@ -82,7 +66,7 @@ export async function createRTCPeerConnectionSource(channel: ScryptedDeviceBase } }; - clientPromise.then(async (client) => { + clientPromise.then((client) => { socket = client; const rtspServer = new RtspServer(socket, undefined, udp); // rtspServer.console = console; @@ -163,12 +147,12 @@ export async function createRTCPeerConnectionSource(channel: ScryptedDeviceBase }); track.onReceiveRtcp.subscribe(rtcp => rtspServer.sendVideo(rtcp.serialize(), true)) track.onReceiveRtp.once(() => { - vi = setInterval(() => videoTransceiver.receiver.sendRtcpPLI(track.ssrc!), 2000); + pictureLossInterval = setInterval(() => videoTransceiver.receiver.sendRtcpPLI(track.ssrc!), 4000); }); }); } - channel.startRTCSignalingSession({ + return channel.startRTCSignalingSession({ createLocalDescription: async (type, setup, sendIceCandidate) => { if (type === 'offer') doSetup(setup);