Files
appRobotWebcam/test/mpjpegParser.test.js
2026-06-07 10:03:34 +02:00

60 lines
1.9 KiB
JavaScript

'use strict';
const { MpjpegParser } = require('../src/cameraSwitch');
// Baut ein FFmpeg-`-f mpjpeg`-Paket: Boundary + Header (Content-Length) + Body + CRLF.
function packet(jpeg) {
return Buffer.concat([
Buffer.from(`--frame\r\nContent-Type: image/jpeg\r\nContent-Length: ${jpeg.length}\r\n\r\n`, 'latin1'),
jpeg,
Buffer.from('\r\n', 'latin1'),
]);
}
describe('MpjpegParser', () => {
test('ein Frame', () => {
const frames = [];
const p = new MpjpegParser((f) => frames.push(f));
const jpeg = Buffer.from([0xFF, 0xD8, 1, 2, 3, 0xFF, 0xD9]);
p.push(packet(jpeg));
expect(frames).toHaveLength(1);
expect(frames[0].equals(jpeg)).toBe(true);
});
test('mehrere Frames in einem Chunk', () => {
const frames = [];
const p = new MpjpegParser((f) => frames.push(f));
const a = Buffer.from([0xFF, 0xD8, 1]);
const b = Buffer.from([0xFF, 0xD8, 2, 3, 4]);
p.push(Buffer.concat([packet(a), packet(b)]));
expect(frames).toHaveLength(2);
expect(frames[0].equals(a)).toBe(true);
expect(frames[1].equals(b)).toBe(true);
});
test('über Chunk-Grenze gesplittetes Frame', () => {
const frames = [];
const p = new MpjpegParser((f) => frames.push(f));
const jpeg = Buffer.from([10, 20, 30, 40, 50]);
const pkt = packet(jpeg);
p.push(pkt.subarray(0, 6)); // mitten im Header
expect(frames).toHaveLength(0);
p.push(pkt.subarray(6)); // Rest
expect(frames).toHaveLength(1);
expect(frames[0].equals(jpeg)).toBe(true);
});
test('Body über mehrere Chunks', () => {
const frames = [];
const p = new MpjpegParser((f) => frames.push(f));
const jpeg = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);
const pkt = packet(jpeg);
const cut = pkt.length - 5; // mitten im Body trennen
p.push(pkt.subarray(0, cut));
expect(frames).toHaveLength(0);
p.push(pkt.subarray(cut));
expect(frames).toHaveLength(1);
expect(frames[0].equals(jpeg)).toBe(true);
});
});