cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

fix/hero-release-note
goq / portal / video-format-transition.test.mjs
video-format-transition.test.mjs 2.4K
1import assert from 'node:assert/strict';2import test from 'node:test';34import { VideoFormatTransitionGuard } from './video-format-transition.mjs';56const frame = (overrides = {}) => ({7 sequence: 1,8 codec: 'h264',9 width: 1280,10 height: 800,11 keyframe: true,12 codecConfig: true,13 discontinuity: false,14 ...overrides,15});1617test('format transitions require configured keyframes and advance epochs monotonically', () => {18 const guard = new VideoFormatTransitionGuard();19 assert.equal(guard.plan(frame({ keyframe: false, codecConfig: false })).action, 'recover');2021 const initial = guard.plan(frame());22 assert.equal(initial.reconfigure, true);23 assert.equal(initial.epoch, 1);24 guard.commit(initial);2526 const ordinary = guard.plan(frame({ sequence: 2, keyframe: false, codecConfig: false }));27 assert.equal(ordinary.reconfigure, false);28 assert.equal(ordinary.epoch, 1);29 guard.commit(ordinary);3031 const resized = guard.plan(frame({ sequence: 3, width: 640, height: 400 }));32 assert.equal(resized.reconfigure, true);33 assert.equal(resized.epoch, 2);34 guard.commit(resized);35 assert.deepEqual(guard.format, { codec: 'h264', width: 640, height: 400 });36});3738test('stale outputs and unconfigured format changes cannot commit', () => {39 const guard = new VideoFormatTransitionGuard();40 guard.commit(guard.plan(frame()));41 assert.equal(guard.plan(frame({ sequence: 1 })).action, 'drop-stale');42 assert.equal(guard.plan(frame({ sequence: 2, width: 640, height: 400,43 keyframe: false, codecConfig: false })).action, 'recover');4445 const first = guard.plan(frame({ sequence: 2, keyframe: false, codecConfig: false }));46 const competing = guard.plan(frame({ sequence: 3, keyframe: false, codecConfig: false }));47 guard.commit(first);48 assert.throws(() => guard.commit(competing), /stale video format transition/);49});5051test('a discontinuity starts a new configured epoch even at the same dimensions', () => {52 const guard = new VideoFormatTransitionGuard();53 guard.commit(guard.plan(frame()));54 const boundary = guard.plan(frame({ sequence: 2, discontinuity: true }));55 assert.equal(boundary.reconfigure, true);56 assert.equal(boundary.epoch, 2);57});5859test('only the negotiated H.264 codec is accepted', () => {60 const guard = new VideoFormatTransitionGuard();61 assert.throws(() => guard.plan(frame({ codec: 'h265' })), /invalid video codec/);62 assert.throws(() => guard.plan(frame({ codec: 'av1' })), /invalid video codec/);63 assert.equal(guard.format, null);64});