From ff738ff0458a70207e2f611287dce2f457c59942 Mon Sep 17 00:00:00 2001 From: KokaKiwi Date: Sat, 9 Aug 2025 14:37:22 +0200 Subject: [PATCH] client: add jitter to media channel and some "realistic" media channel simulation --- client/lib/webrtc.go | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/client/lib/webrtc.go b/client/lib/webrtc.go index 3c12a43..845b4a8 100644 --- a/client/lib/webrtc.go +++ b/client/lib/webrtc.go @@ -398,13 +398,48 @@ func (c *WebRTCPeer) openMediaTrack() { defer ticker.Stop() for ; true; <-ticker.C { - bufSize := randomInt(1000, 2500) + // Add jitter to simulate "realistic" media patterns + jitterDelay := time.Duration(randomInt(0, 200)) * time.Millisecond + time.Sleep(jitterDelay) + + // Vary packet sizes for specific frames types + var bufSize int + frameType := randomInt(1, 100) + switch { + case frameType <= 5: // I-frames: 5% chance, larger + bufSize = randomInt(8000, 15000) + case frameType <= 35: // P-frames: 30% chance, medium + bufSize = randomInt(2000, 5000) + default: // B-frames: 65% chance, smaller + bufSize = randomInt(500, 2000) + } + buf := make([]byte, bufSize) - err := videoTrack.WriteSample(media.Sample{Data: buf, Duration: time.Second}) + // Add some timing variation + frameDuration := time.Duration(randomInt(900, 1100)) * time.Millisecond + + err = videoTrack.WriteSample(media.Sample{Data: buf, Duration: frameDuration}) if err != nil { log.Printf("webrtc.WriteSample ERROR: %s", err) } + + // Simulate some burst of smaller packets + if randomInt(1, 10) == 1 { // 10% chance + burstCount := randomInt(2, 5) + for i := 0; i < burstCount; i++ { + smallBuf := make([]byte, randomInt(100, 400)) + time.Sleep(time.Duration(randomInt(10, 50)) * time.Millisecond) + + frameDuration = time.Duration(randomInt(16, 33)) * time.Millisecond + + err = videoTrack.WriteSample(media.Sample{Data: smallBuf, Duration: frameDuration}) + if err != nil { + log.Printf("webrtc.WriteSample burst ERROR: %s", err) + break + } + } + } } }()