Siavash Sameni
f3e3ee5ed0
fix(wzp-video): cfg-gate dav1d + svt-av1 off Android target
...
shiguredo_dav1d and shiguredo_svt_av1 build scripts panic with
'unsupported target: os=android, arch=aarch64'. The AV1 SW fallback
is only needed on macOS / Linux desktop — Android uses MediaCodec
for AV1 anyway.
- Cargo.toml: AV1 SW deps moved under cfg(not(target_os = "android"))
- lib.rs: cfg-gate the dav1d and svt_av1 modules and re-exports
- factory.rs: on Android, Av1Main paths return NotInitialized when
HW MediaCodec is also unavailable (only path on Android)
- factory tests: assert NotInitialized on Android, Ok elsewhere
Unblocks T4.3.1.1 (Android target-compile of wzp-video / mediacodec).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-12 19:58:37 +04:00
Siavash Sameni
086d0a4845
T6.1.2: Wire AV1 into call engine (factory + step tables)
...
- New: factory.rs — create_video_encoder/decoder dispatch by CodecId with
platform-aware HW→SW fallback. AV1 encoder: SvtAv1Encoder (universal SW).
AV1 decoder: VideoToolboxAv1Decoder (macOS M3+) → MediaCodecAv1Decoder
(Android) → Dav1dDecoder (all platforms fallback).
- controller.rs: codec-specific step tables (H.264/H.265/AV1). AV1 ~30%
lower thresholds than H.264; H.265 ~20% lower. VideoQualityController
gains codec field with with_codec()/set_codec()/codec() accessors.
- lib.rs: export factory fns and VideoToolboxAv1Decoder
- wzp-client/Cargo.toml: add wzp-video dependency
- 11 new tests (7 factory + 4 controller); 77→88 wzp-video tests; fmt +
clippy clean; all workspace tests pass
2026-05-12 19:05:45 +04:00
Siavash Sameni
9334aa5ccd
T6.1: AV1 encoder/decoder with HW probe + SVT-AV1 SW fallback
...
- New: av1_obu.rs — OBU framer, depacketizer, keyframe detection, LEB128 helpers
- New: dav1d.rs — SW AV1 decoder wrapper (shiguredo_dav1d)
- New: svt_av1.rs — SW AV1 encoder wrapper (shiguredo_svt_av1)
- Add CodecId::Av1Main = 12 with match-arm fixes in downstream crates
- Add VideoToolboxAv1Decoder for macOS M3+ HW decode
- Add MediaCodecAv1Encoder/Decoder for Android (video/av01)
- Add extract_sequence_header_obu() helper for AV1 decoder CSD
- Add 10-frame encode-decode roundtrip test (svt_av1 + dav1d)
- Fix clippy unused import in dav1d.rs
- 15 tests; all workspace tests pass; cargo fmt clean
2026-05-12 18:44:44 +04:00
Siavash Sameni
f16d650721
T6.2: Tier F video scorer — keyframe periodicity, I/P ratio, BWE responsiveness + 10 tests
2026-05-12 17:42:39 +04:00
Siavash Sameni
517d0ebfe0
T5.7.1: Unify Verdict enum into wzp_relay::verdict, drop RepeatAbusive variant
2026-05-12 16:49:04 +04:00
Siavash Sameni
ffded2a913
clippy: fix wzp-relay lint issues (empty doc, unused var, TokenExhausted, Default, dead field)
2026-05-12 15:40:55 +04:00
Siavash Sameni
283edd38eb
clippy: fix very_complex_type in wzp-video (HevcParameterSets alias)
2026-05-12 15:40:19 +04:00
Siavash Sameni
fdfaed5390
fmt: cargo fmt --all
2026-05-12 15:40:02 +04:00
Siavash Sameni
dbbab0decf
T5.8: Tier G response policy — Verdict enum + ResponsePolicy + typed Hangup::PolicyViolation + 9 tests
2026-05-12 15:13:20 +04:00
Siavash Sameni
5fda5ecc52
T5.7: Tier F audio scorer — IAT CoV + silence fraction + bitrate + Q-flag + bimodality + 11 tests
2026-05-12 15:09:28 +04:00
Siavash Sameni
2bbb664df4
T5.6: Per-receiver layer selection at SFU — ReceiverState + hysteresis + forwarding filter
2026-05-12 15:05:32 +04:00
Siavash Sameni
2f1a9f74d5
T5.5: 3-layer simulcast at sender — SimulcastEncoder + tick_simulcast() + 10 tests
2026-05-12 14:56:48 +04:00
Siavash Sameni
b197651557
T5.4: H.265 encoder/decoder wrappers — VideoToolbox + MediaCodec, CodecId::H265Main
2026-05-12 14:50:20 +04:00
Siavash Sameni
e34c40dc0f
T5.1.1: PriorityMode default = AudioFirst, QualityProfile backward-compat JSON, SetPriorityMode roundtrip
2026-05-12 14:50:06 +04:00
Siavash Sameni
c48cb6fbcb
T5.3: EncoderMode::SlideFallback — SD-floor detection + VideoEncoder::set_mode() trait hook
2026-05-12 12:40:53 +04:00
Siavash Sameni
2e0bdc5904
T5.2: VideoQualityController with per-mode allocation gates + 8-step target table
2026-05-12 12:34:32 +04:00
Siavash Sameni
276ecc660e
T5.1: PriorityMode enum + SetPriorityMode signal; extend QualityProfile with video fields
2026-05-12 12:21:40 +04:00
Siavash Sameni
001d94f9ae
T4.7 rework: make should_forward_pli take now: Instant + 6 unit tests
...
- Refactor should_forward_pli(room, stream_id) -> should_forward_pli(room, stream_id, now: Instant)
so the 200 ms dedup window is deterministically testable.
- Update the one caller in run_participant_signals to pass Instant::now().
- Add 6 PLI unit tests covering:
* first PLI forwards
* duplicate within 200 ms suppressed
* after 200 ms forwards again
* different streams independent
* different rooms independent
* no stream owner returns None
Addresses reviewer CR on T4.7 (line drawn at T4.6 — stateful relay features must
have state-transition tests).
wzp-relay tests: 93 -> 99 pass.
2026-05-12 11:39:35 +04:00
Siavash Sameni
36b0421d68
T4.7: PLI suppression at SFU — 200 ms dedup window per (room, stream_id)
2026-05-12 11:25:25 +04:00
Siavash Sameni
828fbea2ea
T4.6: SFU keyframe cache — per-(room,sender,stream) I-frame replay on join
2026-05-12 10:54:04 +04:00
Siavash Sameni
cc5aef2534
T4.5: I-frame FEC ratio boost — keyframe-aware repair ratio in RaptorQFecEncoder
...
- Add add_source_symbol_with_keyframe() default method to FecEncoder trait
- RaptorQFecEncoder tracks has_keyframe per block, uses keyframe_ratio
when generating repair symbols for keyframe blocks
- AdaptiveFec gains keyframe_repair_ratio (default 0.5) and wires it
through build_encoder()
- 3 new tests: keyframe boost, non-keyframe nominal ratio, finalize clears flag
- Update status board T4.5 -> Pending Review
2026-05-12 10:36:18 +04:00
Siavash Sameni
397f9d2141
T4.3.1: MediaCodec AMediaCodec wiring via ndk crate (Android); fix wzp-android build on non-Android
2026-05-12 10:03:43 +04:00
Siavash Sameni
410c2a4335
T4.2.1: Real VideoToolbox VTCompressionSession / VTDecompressionSession wiring (macOS)
2026-05-12 09:51:34 +04:00
Siavash Sameni
81042ac190
T4.4: SignalMessage::Nack + PictureLossIndication; NACK sender/receiver state machines
2026-05-12 09:25:29 +04:00
Siavash Sameni
e177e63843
T4.3: MediaCodec H.264 encoder/decoder stub (Android)
2026-05-12 09:15:06 +04:00
Siavash Sameni
3356ba94c6
T4.2: VideoToolbox H.264 encoder/decoder traits (macOS, MVP)
2026-05-12 09:09:57 +04:00
Siavash Sameni
490d2d31c6
T4.1: wzp-video crate scaffold + H.264 NAL framer + depacketizer
2026-05-12 07:22:54 +04:00
Siavash Sameni
f1b86e0fed
T3.5: Tier E per-session token bucket
2026-05-12 06:45:56 +04:00
Siavash Sameni
017c371611
T3.4: Tier D per-codec payload size sanity
2026-05-12 06:24:40 +04:00
Siavash Sameni
e73f8a7150
T3.3: SignalMessage version field
2026-05-12 06:11:59 +04:00
Siavash Sameni
1b4f7b0772
T3.2: Document timestamp_ms monotonic across rekey + test
2026-05-11 21:19:03 +04:00
Siavash Sameni
f3398adb95
T3.1: RoomManager concurrency — Arc<RwLock<Room>> per room
2026-05-11 21:12:04 +04:00
Siavash Sameni
54c1a35186
T2.3-T2.6: BWE guard, relay conformance Tier A/B/C, Prometheus metrics
2026-05-11 20:50:22 +04:00
Siavash Sameni
3de56cf1f9
T2.2: BandwidthEstimator with cwnd/REMB target_send_bps
2026-05-11 19:16:25 +04:00
Siavash Sameni
fe1f9484bd
T2.1: Add SignalMessage::TransportFeedback
2026-05-11 19:06:45 +04:00
Siavash Sameni
0ef1f574ff
T1.8: Per-stream anti-replay window with configurable size
2026-05-11 16:56:09 +04:00
Siavash Sameni
b1c5837495
T1.7: Move QualityReport trailer inside AEAD payload
2026-05-11 16:42:25 +04:00
Siavash Sameni
6f81487778
T1.6: Protocol version negotiation in handshake
2026-05-11 15:53:04 +04:00
Siavash Sameni
30d26fc7f6
T1.5.1: Remove unwrap() from encode_compact
2026-05-11 12:57:35 +04:00
Siavash Sameni
c93d302656
T1.5: Migrate emit/parse sites to v2 wire format
2026-05-11 12:37:32 +04:00
Siavash Sameni
9680b6ff34
T1.4.1: Add rustdoc on MiniHeaderV2 and MiniFrameContextV2 public items
2026-05-11 11:38:04 +04:00
Siavash Sameni
6385b93391
T1.2.1: Add rustdoc on MediaType variants and methods
2026-05-11 11:33:58 +04:00
Siavash Sameni
6eb94f079d
T1.1.1: Address review — add rustdoc on impl MediaHeaderV2 constants and methods
2026-05-11 11:32:00 +04:00
Siavash Sameni
7c9ede9227
T1.1.1: Add rustdoc on MediaHeaderV2 fields
2026-05-11 11:22:21 +04:00
Siavash Sameni
e8866c6632
T1.4: Add v2 MiniHeader with seq_delta
2026-05-11 11:18:15 +04:00
Siavash Sameni
8c6e88ea68
T1.3: Widen CodecId wire representation to u8
2026-05-11 11:11:42 +04:00
Siavash Sameni
ffb92237be
T1.2: Add MediaType enum
2026-05-11 11:09:43 +04:00
Siavash Sameni
6af0539a72
T1.1: Add v2 MediaHeader type
2026-05-11 11:00:51 +04:00
Siavash Sameni
defd8eab07
fix(signal): send PresenceList directly to new client after ack
...
Mirror to GitHub / mirror (push) Failing after 24s
Build Release Binaries / build-amd64 (push) Failing after 3m50s
The broadcast alone wasn't reaching the first client because its
recv loop hadn't started yet when the second client registered.
Now the relay sends PresenceList directly to the new client (right
after RegisterPresenceAck) AND broadcasts to all others.
This guarantees every client gets the full user list:
- New client: via direct send (queued before recv loop starts)
- Existing clients: via broadcast
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-14 18:20:37 +04:00
Siavash Sameni
1120c7b579
feat(signal): PresenceList broadcast for lobby user discovery
...
Build Release Binaries / build-amd64 (push) Failing after 7m21s
Mirror to GitHub / mirror (push) Failing after 27s
New signal infrastructure for the lobby-first UI:
- PresenceUser struct: { fingerprint, alias }
- SignalMessage::PresenceList: relay broadcasts full user list
to all signal clients on every register/deregister
- SignalHub::presence_list(): builds the list from connected clients
- SignalHub::broadcast(): sends to ALL signal clients
- Relay calls broadcast on register + unregister
- Desktop emits "presence_list" signal-event to JS frontend
This gives clients real-time visibility of who's online via the
signal channel, without needing to join a voice room first.
603 tests pass, 0 regressions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-14 18:12:47 +04:00