From 145f116c68276460b1f5ff9787a1d80c41685b3b Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Wed, 29 Mar 2023 09:37:41 -0700 Subject: [PATCH] webrtc/h264: reset stapa sent flag after every idr frame --- .../homekit/src/types/camera/h264-packetizer.ts | 17 +++++++++++++---- plugins/webrtc/package-lock.json | 4 ++-- plugins/webrtc/package.json | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/plugins/homekit/src/types/camera/h264-packetizer.ts b/plugins/homekit/src/types/camera/h264-packetizer.ts index f643d1fa05..be516615fe 100644 --- a/plugins/homekit/src/types/camera/h264-packetizer.ts +++ b/plugins/homekit/src/types/camera/h264-packetizer.ts @@ -64,6 +64,9 @@ export class H264Repacketizer { extraPackets = 0; fuaMax: number; pendingFuA: RtpPacket[]; + // log whether a stapa sps/pps has been seen. + // resets on every idr frame, to trigger codec information + // to be resent. seenStapASps = false; fuaMin: number; @@ -402,8 +405,12 @@ export class H264Repacketizer { // if this is an idr frame, but no sps has been sent via a stapa, dummy one up. // the stream may not contain codec information in stapa or may be sending it // in separate sps/pps packets which is not supported by homekit. - if (originalNalType === NAL_TYPE_IDR && !this.seenStapASps) - this.maybeSendSpsPps(packet, ret); + if (originalNalType === NAL_TYPE_IDR) { + if (!this.seenStapASps) + this.maybeSendSpsPps(packet, ret); + this.seenStapASps = false; + } + } else { if (this.pendingFuA) { @@ -486,10 +493,12 @@ export class H264Repacketizer { return; } - if (nalType === NAL_TYPE_IDR && !this.seenStapASps) { + if (nalType === NAL_TYPE_IDR) { // if this is an idr frame, but no sps has been sent, dummy one up. // the stream may not contain sps. - this.maybeSendSpsPps(packet, ret); + if (!this.seenStapASps) + this.maybeSendSpsPps(packet, ret); + this.seenStapASps = false; } this.fragment(packet, ret); diff --git a/plugins/webrtc/package-lock.json b/plugins/webrtc/package-lock.json index 16efbaf6b5..dd8c14237a 100644 --- a/plugins/webrtc/package-lock.json +++ b/plugins/webrtc/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/webrtc", - "version": "0.1.37", + "version": "0.1.38", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/webrtc", - "version": "0.1.37", + "version": "0.1.38", "dependencies": { "@scrypted/common": "file:../../common", "@scrypted/sdk": "file:../../sdk", diff --git a/plugins/webrtc/package.json b/plugins/webrtc/package.json index fa6e5b5b87..1acba78e4e 100644 --- a/plugins/webrtc/package.json +++ b/plugins/webrtc/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/webrtc", - "version": "0.1.37", + "version": "0.1.38", "scripts": { "scrypted-setup-project": "scrypted-setup-project", "prescrypted-setup-project": "scrypted-package-json",