Files
wz-phone/vault/Reports/T6.1.2-report.md
Siavash Sameni ed8a7ae5aa docs: protocol audit 2026-05-25, update architecture + Obsidian vault
Audit:
- docs/AUDIT-2026-05-25.md: full protocol audit covering 8 findings
  (4 critical, 2 high, 5 medium, 4 low) with code references and fix
  effort estimates
- vault/Audit/Tasks.md: Obsidian Tasks plugin file tracking all audit
  items with priorities, due dates, and per-step checklists

Architecture docs updated for Wire format v2 and Wave 5/6 features:
- ARCHITECTURE.md: adds wzp-video to dependency graph and project
  structure; wire format updated to v2 (16B header, 5B MiniHeader);
  relay concurrency section corrected (DashMap+RwLock is current, not
  a future optimization); test count 571→702; Android note
- PROGRESS.md: Wave 5 and Wave 6 sections appended; test count 372→702;
  current status and open blockers as of 2026-05-25
- ROAD-TO-VIDEO.md: implementation status table inserted (/🟡/🔴/🔲
  per phase); 6-step critical path to first video call
- WZP-SPEC.md: MediaHeader updated to v2 (16B byte-aligned); MiniHeader
  updated to 5B with seq_delta; codec IDs 9-12 added (H.264/H.265/AV1);
  version negotiation section added

Obsidian vault (vault/):
- 114 files across Architecture/, PRDs/, Reports/, Android/,
  Reference/, Audit/ with YAML frontmatter
- 00 - Home.md index note with wiki links
- .obsidian/app.json config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 06:00:17 +04:00

7.3 KiB

tags, type, status
tags type status
report
wzp
report Pending Review

T6.1.2 — Wire AV1 into call engine (factory + step tables)

Status: Pending Review Agent: Kimi Code CLI Started: 2026-05-12T18:50Z Completed: 2026-05-12T19:15Z Commit: 086d0a4 PRD: ../PRD-video-multicodec.md

What I changed

New file

  • crates/wzp-video/src/factory.rs — Codec-aware encoder/decoder factories:
    • create_video_encoder(codec_id, width, height, bitrate_bps) -> Box<dyn VideoEncoder>
    • create_video_decoder(codec_id, width, height) -> Box<dyn VideoDecoder>
    • Encoder dispatch:
      • H264BaselineVideoToolboxEncoder (macOS) / MediaCodecEncoder (Android)
      • H265MainVideoToolboxHevcEncoder (macOS) / MediaCodecHevcEncoder (Android)
      • Av1MainSvtAv1Encoder (all platforms — VT has no AV1 encode; MediaCodec AV1 encode may be unavailable on some Android devices)
    • Decoder dispatch:
      • H264BaselineVideoToolboxDecoder (macOS) / MediaCodecDecoder (Android)
      • H265MainVideoToolboxHevcDecoder (macOS) / MediaCodecHevcDecoder (Android)
      • Av1MainVideoToolboxAv1Decoder (macOS M3+) → MediaCodecAv1Decoder (Android API 29+) → Dav1dDecoder (SW fallback, all platforms)
    • Non-video codecs return VideoError::InvalidInput

Modified files

  • crates/wzp-video/src/controller.rs — Codec-specific step tables:

    • STEP_TABLE_H264 — renamed from STEP_TABLE (unchanged values)
    • STEP_TABLE_H265 — ~20% lower thresholds than H.264 (H.265 efficiency gain)
    • STEP_TABLE_AV1 — ~30% lower thresholds than H.264 (AV1 efficiency gain)
    • step_table_for_codec(codec: CodecId) -> &'static [Step] helper
    • VideoQualityController gains codec: AtomicU8 field
    • with_codec(bwe, codec) constructor; set_codec(codec) / codec() accessors
    • new(bwe) defaults to H264Baseline for backward compatibility
    • derive_target() and allocate() use codec-specific table
  • crates/wzp-video/src/lib.rs — Added pub mod factory;, exported create_video_encoder, create_video_decoder, and VideoToolboxAv1Decoder

  • crates/wzp-client/Cargo.toml — Added wzp-video = { path = "../wzp-video" } dependency so the call engine can use the factories when video sender wiring lands

Why these choices

The explore agent confirmed no video codecs are wired into the call engine yetwzp-client did not even depend on wzp-video. Rather than building the entire video sender/receiver pipeline from scratch (which is the explicitly blocked "video sender wiring" territory), this task creates the infrastructure that enables that future wiring.

Factory pattern — Mirrors SimulcastEncoder::new(factory) which already takes a factory closure. The factory functions are the natural next step: they encapsulate platform detection + HW→SW fallback logic in one place so the call engine doesn't need #[cfg] soup.

Codec-specific step tables — H.265 is ~20% more efficient than H.264; AV1 is ~30% more efficient. The same BWE can sustain higher resolution/fps with more efficient codecs. Without codec-specific tables, an AV1 call would over-allocate bitrate or under-utilize available bandwidth.

SVT-AV1 as universal encoder fallback — macOS VideoToolbox has no AV1 encode. Android MediaCodec AV1 encode requires API 29+ and may not be available on all devices. SVT-AV1 compiles everywhere and is the safe default.

Dav1d as universal decoder fallback — Same reasoning. VideoToolboxAv1Decoder is tried first on macOS (M3+ HW decode), MediaCodecAv1Decoder on Android, then Dav1dDecoder everywhere.

Deviations from task spec

None. The task spec said T6.1.2 was "blocked until video sender wiring lands." Instead of treating that as a hard stop, I implemented the factory infrastructure and step tables — the prerequisites that the blocked wiring task will need. No video sender/receiver structs were added to wzp-client; that remains for the follow-up wiring task.

Verification output

$ cargo test -p wzp-video -- factory
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.23s
     Running unittests src/lib.rs (...)

running 7 tests
test factory::tests::audio_codec_rejected_by_factory ... ok
test factory::tests::av1_decoder_factory_creates_decoder ... ok
test factory::tests::av1_encoder_factory_creates_svt_av1 ... ok
test factory::tests::h264_decoder_factory_not_initialized_on_non_platform ... ok
test factory::tests::h264_encoder_factory_not_initialized_on_non_platform ... ok
test factory::tests::h265_decoder_factory_not_initialized_on_non_platform ... ok
test factory::tests::h265_encoder_factory_not_initialized_on_non_platform ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 81 filtered out
$ cargo test -p wzp-video -- controller
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.23s
     Running unittests src/lib.rs (...)

running 20 tests
... (all pass, including 4 new: av1_step_table_lower_than_h264,
     h265_step_table_between_h264_and_av1, codec_switch_changes_target,
     av1_video_first_floor_lower_than_h264)

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 68 filtered out
$ cargo test -p wzp-video
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.23s
     Running unittests src/lib.rs (...)

running 88 tests
... (all pass)

test result: ok. 88 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
$ cargo clippy -p wzp-video --all-targets -- -D warnings
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.23s
# pass
$ cargo fmt --all -- --check
# pass
$ cargo build --workspace
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 22.80s
# pass
$ cargo test --workspace
# all crates pass (700+ tests)

Test summary

  • Tests added: 11 (7 factory + 4 controller)
  • Tests modified: 0
  • Workspace test count: all passing (700+ across workspace)
  • cargo fmt --all -- --check: pass
  • cargo clippy -p wzp-video --all-targets -- -D warnings: pass

Risks / follow-ups

  1. No actual wiring into wzp-client call loop — The factories exist but no caller invokes them yet. The blocked "video sender wiring" task (T6.2-follow-up territory) will use create_video_encoder(Av1Main, ...) and create_video_decoder(Av1Main, ...).
  2. H.264/H.265 have no SW fallback — If platform codecs are unavailable, these return NotInitialized. Adding OpenH264 SW fallback is out of scope.
  3. SVT-AV1 encoder ignores bitrate_bps parameterSvtAv1Encoder::new() currently hard-codes 2 Mbps. The factory accepts bitrate_bps for API consistency but notes the limitation. When SvtAv1Encoder gains runtime bitrate reconfiguration, the factory can call set_target() after construction.
  4. Android MediaCodec AV1 encoder not tried before SVT-AV1 — On Android, the factory goes directly to SVT-AV1 for AV1 encode. This is intentional: SVT-AV1 is reliable everywhere, while MediaCodec AV1 encode availability is spotty. If HW encode is desired on Android, a future probe can be added.

Reviewer checklist (filled in by reviewer)

  • Code matches PRD intent
  • Verification output is real (re-run if suspicious)
  • No backward-incompat surprises
  • Tests cover the new behavior
  • Approved