frame pacing fix

This commit is contained in:
Dmitry Sergeev
2026-09-02 00:39:30 +03:00
parent da5ff8ea4a
commit b8cb750fb4
5 changed files with 118 additions and 1 deletions
+49
View File
@@ -144,3 +144,52 @@ func TestVideoBridgeNextHonorsCancellation(t *testing.T) {
t.Fatalf("Next() error = %v, want %v", err, context.Canceled)
}
}
func TestVideoBridgeTryNextReturnsImmediatelyWhenEmpty(t *testing.T) {
bridge := NewVideoBridge()
if pending, ok := bridge.TryNext(); ok || pending != nil {
t.Fatalf("TryNext() = %#v, %t; want nil, false", pending, ok)
}
}
func TestVideoBridgeTryNextDeliversWithoutCopyAndRequiresCompletion(t *testing.T) {
bridge := NewVideoBridge()
frame := VideoFrame{Index: 9, Payload: []byte{1, 2, 3}}
consumeResult := make(chan error, 1)
started := make(chan struct{})
go func() {
close(started)
consumeResult <- bridge.ConsumeVideo(context.Background(), frame)
}()
<-started
deadline := time.Now().Add(videoBridgeTestTimeout)
var pending *PendingVideoFrame
for pending == nil && time.Now().Before(deadline) {
pending, _ = bridge.TryNext()
if pending == nil {
time.Sleep(time.Millisecond)
}
}
if pending == nil {
t.Fatal("TryNext() did not receive waiting producer")
}
if &pending.Frame.Payload[0] != &frame.Payload[0] {
t.Fatal("TryNext() copied borrowed payload")
}
select {
case err := <-consumeResult:
t.Fatalf("ConsumeVideo() returned before completion: %v", err)
default:
}
pending.Complete(nil)
select {
case err := <-consumeResult:
if err != nil {
t.Fatalf("ConsumeVideo() error = %v", err)
}
case <-time.After(videoBridgeTestTimeout):
t.Fatal("ConsumeVideo() did not return after completion")
}
}