Files

2.4 KiB

Custom WebRTC for Rosetta iOS (Audio E2EE Timestamp)

This setup builds a custom WebRTC.xcframework for iOS and patches audio E2EE so FrameEncryptor/FrameDecryptor receive non-empty additional_data with RTP timestamp bytes.

Why

Stock stasel/WebRTC M146 calls audio frame encryptor with empty additional_data (ad=0), so nonce derivation based on timestamp is unavailable.

Desktop uses frame timestamp for nonce. This patch aligns iOS with that approach by passing an 8-byte big-endian timestamp payload in additional_data (absolute RTP timestamp, including sender start offset):

  • bytes 0..3 = 0
  • bytes 4..7 = RTP timestamp (big-endian)

Same patch as Android: mobile-android/tools/webrtc-custom/patches/0001-...

Files

  • build_custom_webrtc_ios.sh — reproducible build script
  • patches/0001-audio-e2ee-pass-rtp-timestamp-as-additional-data.patch — WebRTC patch (identical to Android)

Build

Requirements: macOS, Xcode, depot_tools in PATH.

Bootstrap depot_tools first (if not installed):

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git ~/depot_tools
export PATH=$PATH:$HOME/depot_tools

Then build:

cd /path/to/Rosetta/tools/webrtc-custom-ios
./build_custom_webrtc_ios.sh

Optional env vars:

  • WEBRTC_ROOT — checkout root (default: $HOME/webrtc_ios)
  • WEBRTC_BRANCH — default branch-heads/6422 (M125, same as Android)
  • WEBRTC_TAG — use a specific tag/commit instead of branch
  • OUT_FRAMEWORK — output xcframework path (default: Frameworks/WebRTC.xcframework)
  • SYNC_JOBSgclient sync jobs (default: 1)
  • SYNC_RETRIES — sync retry attempts (default: 8)

Integration in Xcode

  1. Remove stasel/WebRTC SPM dependency from Xcode project
  2. Add Frameworks/WebRTC.xcframework as Embedded Framework
  3. Build and verify: diagnostic logs should show ad=8 instead of ad=0

Verification

After building and integrating:

ENC frame#0 sz=53 ad=8 mode=raw-abs nonce=[00000000XXXXXXXX]
DEC frame#0 sz=48 ad=8 mode=raw-abs ok=1 nonce=[00000000XXXXXXXX]

Where XXXXXXXX is the RTP timestamp in hex. This matches Desktop and Android behavior.

Maintenance

  • Keep patch small: only audio/channel_send.cc + audio/channel_receive.cc
  • Pin WebRTC branch/tag for releases (M125 = branch-heads/6422)
  • Rebuild xcframework on version bumps
  • Verify ad=8 in diagnostic logs after each rebuild