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 scriptpatches/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— defaultbranch-heads/6422(M125, same as Android)WEBRTC_TAG— use a specific tag/commit instead of branchOUT_FRAMEWORK— output xcframework path (default:Frameworks/WebRTC.xcframework)SYNC_JOBS—gclient syncjobs (default:1)SYNC_RETRIES— sync retry attempts (default:8)
Integration in Xcode
- Remove
stasel/WebRTCSPM dependency from Xcode project - Add
Frameworks/WebRTC.xcframeworkas Embedded Framework - Build and verify: diagnostic logs should show
ad=8instead ofad=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=8in diagnostic logs after each rebuild