From 35dadaab93db64309cefc4f69705c4df7033c605 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Wed, 9 Apr 2025 09:37:45 -0700 Subject: [PATCH 01/10] server: enable tcp keepalive for cluster --- server/src/scrypted-cluster-main.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/src/scrypted-cluster-main.ts b/server/src/scrypted-cluster-main.ts index 6d5d68364..5c51c2522 100644 --- a/server/src/scrypted-cluster-main.ts +++ b/server/src/scrypted-cluster-main.ts @@ -244,6 +244,7 @@ export function startClusterClient(mainFilename: string, options?: { port, // require ipv4 to normalize cluster address. family: 4, + keepAlive: true, }); try { @@ -349,6 +350,8 @@ export function createClusterServer(mainFilename: string, scryptedRuntime: Scryp console.log('Cluster client disconnected.', socket.remoteAddress, socket.remotePort); }); + socket.setKeepAlive(true); + const peer = preparePeer(socket, 'server'); const connectForkWorker: ConnectForkWorker = async (auth: ClusterObject, properties: ClusterWorkerProperties) => { From 9e655c0a53129e6a47a3dca5383a444733dd7d58 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Wed, 9 Apr 2025 09:37:54 -0700 Subject: [PATCH 02/10] postbeta --- server/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/package.json b/server/package.json index 23de51d56..f8072c7b5 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/server", - "version": "0.138.20", + "version": "0.138.21", "description": "", "dependencies": { "@scrypted/ffmpeg-static": "^6.1.0-build3", From 5698551b7efa56258b279afd05409613cd7286b9 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Wed, 9 Apr 2025 15:33:50 -0700 Subject: [PATCH 03/10] common: fix h265 aggregation packet recency check --- plugins/webrtc/src/h265-packetizer.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/webrtc/src/h265-packetizer.ts b/plugins/webrtc/src/h265-packetizer.ts index 34255851d..731b1d91a 100644 --- a/plugins/webrtc/src/h265-packetizer.ts +++ b/plugins/webrtc/src/h265-packetizer.ts @@ -443,16 +443,16 @@ export class H265Repacketizer { } maybeSendAPCodecInfo(packet: RtpPacket, ret: RtpPacket[]) { - // can not send codec info if in the middle of sending packets for a specific rtp timestamp. - if (!this.sentMarker) - return; - if (this.ap) { // AP with codec information was sent recently, no need to send codec info. this.ap = undefined; return; } + // can not send codec info if in the middle of sending packets for a specific rtp timestamp. + if (!this.sentMarker) + return; + // vps is not required. if (!this.codecInfo?.sps || !this.codecInfo?.pps) return; @@ -600,10 +600,10 @@ export class H265Repacketizer { hasPps = true; this.updatePps(payload); } - else if (nalType === NAL_TYPE_SEI_PREFIX ) { + else if (nalType === NAL_TYPE_SEI_PREFIX) { this.updateSeiPrefix(payload); } - else if ( nalType === NAL_TYPE_SEI_SUFFIX) { + else if (nalType === NAL_TYPE_SEI_SUFFIX) { this.updateSeiSuffix(payload); } else if (nalType === NAL_TYPE_AUD) { @@ -672,12 +672,12 @@ export class H265Repacketizer { this.updatePps(packet.payload); return; } - else if (nalType === NAL_TYPE_SEI_PREFIX ) { + else if (nalType === NAL_TYPE_SEI_PREFIX) { this.extraPackets--; this.updateSeiPrefix(packet.payload); return; } - else if ( nalType === NAL_TYPE_SEI_SUFFIX) { + else if (nalType === NAL_TYPE_SEI_SUFFIX) { this.extraPackets--; this.updateSeiSuffix(packet.payload); return; From c620a4e1267c167107e065cf40c5595fd16ea5f8 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 10:47:48 -0700 Subject: [PATCH 04/10] server: ensure sendStream terminates on connection close --- server/src/http-interfaces.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/http-interfaces.ts b/server/src/http-interfaces.ts index 04a5e009a..f6f074c69 100644 --- a/server/src/http-interfaces.ts +++ b/server/src/http-interfaces.ts @@ -97,7 +97,12 @@ export class HttpResponseImpl implements HttpResponse { stream = await clusterSetup.connectRPCObject(stream); for await (const chunk of stream) { - this.res.write(chunk); + await new Promise((r, f) => this.res.write(chunk, e => { + if (e) + f(e); + else + r(); + })); } this.res.end(); } From 2e4dbceb0e2d30fcec59b2a8d0ea18f9e5932868 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 10:47:58 -0700 Subject: [PATCH 05/10] postbeta --- server/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/package.json b/server/package.json index f8072c7b5..365c3b872 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/server", - "version": "0.138.21", + "version": "0.138.22", "description": "", "dependencies": { "@scrypted/ffmpeg-static": "^6.1.0-build3", From 453469ed98035396313c2bdadd2da7c642233eb4 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 10:52:42 -0700 Subject: [PATCH 06/10] server: implement sendStream backpressure handling --- server/package-lock.json | 4 ++-- server/src/http-interfaces.ts | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 96b38b2b0..9ed29c5cb 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/server", - "version": "0.138.20", + "version": "0.138.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/server", - "version": "0.138.20", + "version": "0.138.22", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/server/src/http-interfaces.ts b/server/src/http-interfaces.ts index f6f074c69..808878950 100644 --- a/server/src/http-interfaces.ts +++ b/server/src/http-interfaces.ts @@ -97,12 +97,15 @@ export class HttpResponseImpl implements HttpResponse { stream = await clusterSetup.connectRPCObject(stream); for await (const chunk of stream) { - await new Promise((r, f) => this.res.write(chunk, e => { - if (e) - f(e); - else - r(); - })); + if (this.res.closed || this.res.destroyed) + return; + + const more = this.res.write(chunk); + if (!more) + await new Promise(r => this.res.once('drain', r)); + + if (this.res.closed || this.res.destroyed) + return; } this.res.end(); } From df1155cf82b960a26de0d33934d393b2e9e73229 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 10:52:51 -0700 Subject: [PATCH 07/10] postbeta --- server/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/package.json b/server/package.json index 365c3b872..098dc3374 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/server", - "version": "0.138.22", + "version": "0.138.23", "description": "", "dependencies": { "@scrypted/ffmpeg-static": "^6.1.0-build3", From 3ceef8ff874825acf53d396fdaea7cafe55b28c2 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 19:10:41 -0700 Subject: [PATCH 08/10] install: update intel repos --- install/docker/install-intel-graphics.sh | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/install/docker/install-intel-graphics.sh b/install/docker/install-intel-graphics.sh index bfe2b2d55..8afcda8eb 100644 --- a/install/docker/install-intel-graphics.sh +++ b/install/docker/install-intel-graphics.sh @@ -4,6 +4,24 @@ then exit 0 fi + +UBUNTU_22_04=$(lsb_release -r | grep "22.04") +UBUNTU_24_04=$(lsb_release -r | grep "24.04") + +# needs either ubuntu 22.0.4 or 24.04 +if [ -z "$UBUNTU_22_04" ] && [ -z "$UBUNTU_24_04" ] +then + echo "Intel graphics package can not be installed. Ubuntu version could not be detected when checking lsb-release and /etc/os-release." + exit 1 +fi + +if [ -n "$UBUNTU_22_04" ] +then + distro="jammy" +else + distro="noble" +fi + # no errors beyond this point set -e @@ -24,7 +42,7 @@ echo "Installing Intel graphics packages." apt-get update && apt-get install -y gpg-agent && rm -f /usr/share/keyrings/intel-graphics.gpg && curl -L https://repositories.intel.com/graphics/intel-graphics.key | gpg --dearmor --yes --output /usr/share/keyrings/intel-graphics.gpg && -echo 'deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphics/ubuntu jammy arc' | tee /etc/apt/sources.list.d/intel.gpu.jammy.list && +echo 'deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphics/ubuntu '$distro' arc' | tee /etc/apt/sources.list.d/intel.gpu.$distro.list && apt-get -y update && apt-get -y install intel-media-va-driver-non-free && apt-get -y dist-upgrade; From 6bf10d4affa4eed6680ea876fb1deb77906ba166 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 19:31:11 -0700 Subject: [PATCH 09/10] install: update intel repos --- install/docker/install-intel-graphics.sh | 28 ++++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/install/docker/install-intel-graphics.sh b/install/docker/install-intel-graphics.sh index 8afcda8eb..b80e7408d 100644 --- a/install/docker/install-intel-graphics.sh +++ b/install/docker/install-intel-graphics.sh @@ -18,6 +18,7 @@ fi if [ -n "$UBUNTU_22_04" ] then distro="jammy" + else distro="noble" fi @@ -39,13 +40,26 @@ set -e # need intel-media-va-driver-non-free, but all the other intel packages are installed from Intel github. echo "Installing Intel graphics packages." -apt-get update && apt-get install -y gpg-agent && -rm -f /usr/share/keyrings/intel-graphics.gpg && -curl -L https://repositories.intel.com/graphics/intel-graphics.key | gpg --dearmor --yes --output /usr/share/keyrings/intel-graphics.gpg && -echo 'deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphics/ubuntu '$distro' arc' | tee /etc/apt/sources.list.d/intel.gpu.$distro.list && -apt-get -y update && -apt-get -y install intel-media-va-driver-non-free && -apt-get -y dist-upgrade; + +if [ "$distro" == "jammy" ] +then + apt-get update && apt-get install -y gpg-agent && + rm -f /usr/share/keyrings/intel-graphics.gpg && + curl -L https://repositories.intel.com/graphics/intel-graphics.key | gpg --dearmor --yes --output /usr/share/keyrings/intel-graphics.gpg && + echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphics/ubuntu $distro arc" | tee /etc/apt/sources.list.d/intel.gpu.$distro.list && + apt-get -y update && + apt-get -y install intel-media-va-driver-non-free && + apt-get -y dist-upgrade; +else + apt-get update && apt-get install -y gpg-agent && + rm -f /usr/share/keyrings/intel-graphics.gpg && + curl -L https://repositories.intel.com/gpu/intel-graphics.key | gpg --dearmor --yes --output /usr/share/keyrings/intel-graphics.gpg && + echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu $distro unified" | tee /etc/apt/sources.list.d/intel-gpu-$distro.list && + apt-get -y update && + apt-get -y install intel-media-va-driver-non-free && + apt-get -y dist-upgrade; +fi + rm -rf /tmp/gpu && mkdir -p /tmp/gpu && cd /tmp/gpu From d1bfed30192833de8ddee258e89b964485891901 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 10 Apr 2025 20:35:37 -0700 Subject: [PATCH 10/10] install: make sure amd installer updates repos? --- install/docker/install-amd-graphics.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install/docker/install-amd-graphics.sh b/install/docker/install-amd-graphics.sh index b2073b3ba..9e677c069 100644 --- a/install/docker/install-amd-graphics.sh +++ b/install/docker/install-amd-graphics.sh @@ -34,8 +34,10 @@ set -e mkdir -p /tmp/amd cd /tmp/amd curl -O -L http://repo.radeon.com/amdgpu-install/latest/ubuntu/$distro/$FILENAME +apt -y update apt -y install rsync dpkg -i $FILENAME +apt -y update amdgpu-install --usecase=opencl --no-dkms -y --accept-eula cd /tmp rm -rf /tmp/amd