From c5764b71a6c4cc677fa0e08bbb6bc0111c3138bd Mon Sep 17 00:00:00 2001 From: DavidVentura Date: Tue, 30 Jan 2024 13:43:09 +0100 Subject: [PATCH] handle duplicate/missing packets when dealing with frames --- handlers.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/handlers.ts b/handlers.ts index d8e9601..b6a829c 100644 --- a/handlers.ts +++ b/handlers.ts @@ -140,6 +140,8 @@ export const createResponseForControlCommand = (session: Session, dv: DataView): } }; +let seq = 0; +let frame_is_bad = false; const deal_with_data = (session: Session, dv: DataView) => { const pkt_len = dv.add(2).readU16(); // data @@ -148,6 +150,7 @@ const deal_with_data = (session: Session, dv: DataView) => { const m_hdr = dv.add(8).readByteArray(4); let is_new_image = true; let audio = true; + const pkt_id = dv.add(6).readU16(); for (let i = 0; i < 4; i++) { is_new_image = is_new_image && m_hdr.add(i).readU8() == JPEG_HEADER[i]; audio = audio && m_hdr.add(i).readU8() == AUDIO_HEADER[i]; @@ -165,11 +168,27 @@ const deal_with_data = (session: Session, dv: DataView) => { } else { const data = dv.add(8).readByteArray(pkt_len - 4); if (is_new_image) { - if (curImage != null) { + if (curImage != null && !frame_is_bad) { session.eventEmitter.emit("frame", curImage); } + + frame_is_bad = false; curImage = Buffer.from(data.buffer); + seq = pkt_id; } else { + if (pkt_id <= seq) { + // retransmit + return; + } + if (frame_is_bad) { + return; + } + if (pkt_id > seq + 1) { + // missed some packets -- filling with zeroes still produces a broken image + frame_is_bad = true; + return; + } + seq = pkt_id; if (curImage != null) { curImage = Buffer.concat([curImage, Buffer.from(data.buffer)]); }