From 86e7cced7861c8da9e12ed351dce43a57ade9b0d Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 1 Jun 2026 15:57:55 -0700 Subject: [PATCH] homekit: add mp4 fragment io timeout --- common/src/ffmpeg-mp4-parser-session.ts | 31 ++++++++++++------- .../src/types/camera/camera-recording.ts | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/common/src/ffmpeg-mp4-parser-session.ts b/common/src/ffmpeg-mp4-parser-session.ts index 270f39dc7..7f992a167 100644 --- a/common/src/ffmpeg-mp4-parser-session.ts +++ b/common/src/ffmpeg-mp4-parser-session.ts @@ -7,19 +7,28 @@ import { readLength } from './read-stream'; const { mediaManager } = sdk; -export async function* parseFragmentedMP4(readable: Readable): AsyncGenerator { +export async function* parseFragmentedMP4(readable: Readable, timeout = 0): AsyncGenerator { while (true) { - const header = await readLength(readable, 8); - const length = header.readInt32BE(0) - 8; - const type = header.slice(4).toString(); - const data = await readLength(readable, length); + const t = timeout ? setTimeout(() => { + readable.destroy(new Error('Timeout waiting for MP4 atom')); + }, timeout) : undefined; + try { + const header = await readLength(readable, 8); + const length = header.readInt32BE(0) - 8; + const type = header.slice(4).toString(); + const data = await readLength(readable, length); + clearTimeout(t); - yield { - header, - length, - type, - data, - }; + yield { + header, + length, + type, + data, + }; + } + finally { + clearTimeout(t); + } } } diff --git a/plugins/homekit/src/types/camera/camera-recording.ts b/plugins/homekit/src/types/camera/camera-recording.ts index ea814839f..3b9f8f754 100644 --- a/plugins/homekit/src/types/camera/camera-recording.ts +++ b/plugins/homekit/src/types/camera/camera-recording.ts @@ -162,7 +162,7 @@ export async function* handleFragmentsRequests(streamId: number, device: Scrypte session = { socket, cp: undefined, - generator: parseFragmentedMP4(socket), + generator: parseFragmentedMP4(socket, 30000), } } else {