Skip to content

Commit 410c582

Browse files
enobufskevmo314
authored andcommittedMar 15, 2024
Fix a bug in AbsCpatureTimeExtension
1 parent 78da5a2 commit 410c582

File tree

2 files changed

+89
-33
lines changed

2 files changed

+89
-33
lines changed
 

‎abscapturetimeextension.go

+16
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,15 @@ func (t AbsCaptureTimeExtension) EstimatedCaptureClockOffsetDuration() *time.Dur
6666
return nil
6767
}
6868
offset := *t.EstimatedCaptureClockOffset
69+
negative := false
70+
if offset < 0 {
71+
offset = -offset
72+
negative = true
73+
}
6974
duration := time.Duration(offset/(1<<32))*time.Second + time.Duration((offset&0xFFFFFFFF)*1e9/(1<<32))*time.Nanosecond
75+
if negative {
76+
duration = -duration
77+
}
7078
return &duration
7179
}
7280

@@ -80,9 +88,17 @@ func NewAbsCaptureTimeExtension(captureTime time.Time) *AbsCaptureTimeExtension
8088
// NewAbsCaptureTimeExtensionWithCaptureClockOffset makes new AbsCaptureTimeExtension from time.Time and a clock offset.
8189
func NewAbsCaptureTimeExtensionWithCaptureClockOffset(captureTime time.Time, captureClockOffset time.Duration) *AbsCaptureTimeExtension {
8290
ns := captureClockOffset.Nanoseconds()
91+
negative := false
92+
if ns < 0 {
93+
ns = -ns
94+
negative = true
95+
}
8396
lsb := (ns / 1e9) & 0xFFFFFFFF
8497
msb := (((ns % 1e9) * (1 << 32)) / 1e9) & 0xFFFFFFFF
8598
offset := (lsb << 32) | msb
99+
if negative {
100+
offset = -offset
101+
}
86102
return &AbsCaptureTimeExtension{
87103
Timestamp: toNtpTime(captureTime),
88104
EstimatedCaptureClockOffset: &offset,

‎abscapturetimeextension_test.go

+73-33
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,78 @@ import (
99
)
1010

1111
func TestAbsCaptureTimeExtension_Roundtrip(t *testing.T) {
12-
t0 := time.Now()
13-
e1 := NewAbsCaptureTimeExtension(t0)
14-
b1, err1 := e1.Marshal()
15-
if err1 != nil {
16-
t.Fatal(err1)
17-
}
18-
var o1 AbsCaptureTimeExtension
19-
if err := o1.Unmarshal(b1); err != nil {
20-
t.Fatal(err)
21-
}
22-
dt1 := o1.CaptureTime().Sub(t0).Seconds()
23-
if dt1 < -0.001 || dt1 > 0.001 {
24-
t.Fatalf("timestamp differs, want %v got %v (dt=%f)", t0, o1.CaptureTime(), dt1)
25-
}
26-
if o1.EstimatedCaptureClockOffsetDuration() != nil {
27-
t.Fatalf("duration differs, want nil got %d", o1.EstimatedCaptureClockOffsetDuration())
28-
}
12+
t.Run("positive captureClockOffset", func(t *testing.T) {
13+
t0 := time.Now()
14+
e1 := NewAbsCaptureTimeExtension(t0)
15+
b1, err1 := e1.Marshal()
16+
if err1 != nil {
17+
t.Fatal(err1)
18+
}
19+
var o1 AbsCaptureTimeExtension
20+
if err := o1.Unmarshal(b1); err != nil {
21+
t.Fatal(err)
22+
}
23+
dt1 := o1.CaptureTime().Sub(t0).Seconds()
24+
if dt1 < -0.001 || dt1 > 0.001 {
25+
t.Fatalf("timestamp differs, want %v got %v (dt=%f)", t0, o1.CaptureTime(), dt1)
26+
}
27+
if o1.EstimatedCaptureClockOffsetDuration() != nil {
28+
t.Fatalf("duration differs, want nil got %d", o1.EstimatedCaptureClockOffsetDuration())
29+
}
2930

30-
e2 := NewAbsCaptureTimeExtensionWithCaptureClockOffset(t0, 1250*time.Millisecond)
31-
b2, err2 := e2.Marshal()
32-
if err2 != nil {
33-
t.Fatal(err2)
34-
}
35-
var o2 AbsCaptureTimeExtension
36-
if err := o2.Unmarshal(b2); err != nil {
37-
t.Fatal(err)
38-
}
39-
dt2 := o1.CaptureTime().Sub(t0).Seconds()
40-
if dt2 < -0.001 || dt2 > 0.001 {
41-
t.Fatalf("timestamp differs, want %v got %v (dt=%f)", t0, o2.CaptureTime(), dt2)
42-
}
43-
if *o2.EstimatedCaptureClockOffsetDuration() != 1250*time.Millisecond {
44-
t.Fatalf("duration differs, want 250ms got %d", *o2.EstimatedCaptureClockOffsetDuration())
45-
}
31+
e2 := NewAbsCaptureTimeExtensionWithCaptureClockOffset(t0, 1250*time.Millisecond)
32+
b2, err2 := e2.Marshal()
33+
if err2 != nil {
34+
t.Fatal(err2)
35+
}
36+
var o2 AbsCaptureTimeExtension
37+
if err := o2.Unmarshal(b2); err != nil {
38+
t.Fatal(err)
39+
}
40+
dt2 := o1.CaptureTime().Sub(t0).Seconds()
41+
if dt2 < -0.001 || dt2 > 0.001 {
42+
t.Fatalf("timestamp differs, want %v got %v (dt=%f)", t0, o2.CaptureTime(), dt2)
43+
}
44+
if *o2.EstimatedCaptureClockOffsetDuration() != 1250*time.Millisecond {
45+
t.Fatalf("duration differs, want 250ms got %d", *o2.EstimatedCaptureClockOffsetDuration())
46+
}
47+
})
48+
49+
// This test can verify the for for the issue 247
50+
t.Run("negative captureClockOffset", func(t *testing.T) {
51+
t0 := time.Now()
52+
e1 := NewAbsCaptureTimeExtension(t0)
53+
b1, err1 := e1.Marshal()
54+
if err1 != nil {
55+
t.Fatal(err1)
56+
}
57+
var o1 AbsCaptureTimeExtension
58+
if err := o1.Unmarshal(b1); err != nil {
59+
t.Fatal(err)
60+
}
61+
dt1 := o1.CaptureTime().Sub(t0).Seconds()
62+
if dt1 < -0.001 || dt1 > 0.001 {
63+
t.Fatalf("timestamp differs, want %v got %v (dt=%f)", t0, o1.CaptureTime(), dt1)
64+
}
65+
if o1.EstimatedCaptureClockOffsetDuration() != nil {
66+
t.Fatalf("duration differs, want nil got %d", o1.EstimatedCaptureClockOffsetDuration())
67+
}
68+
69+
e2 := NewAbsCaptureTimeExtensionWithCaptureClockOffset(t0, -250*time.Millisecond)
70+
b2, err2 := e2.Marshal()
71+
if err2 != nil {
72+
t.Fatal(err2)
73+
}
74+
var o2 AbsCaptureTimeExtension
75+
if err := o2.Unmarshal(b2); err != nil {
76+
t.Fatal(err)
77+
}
78+
dt2 := o1.CaptureTime().Sub(t0).Seconds()
79+
if dt2 < -0.001 || dt2 > 0.001 {
80+
t.Fatalf("timestamp differs, want %v got %v (dt=%f)", t0, o2.CaptureTime(), dt2)
81+
}
82+
if *o2.EstimatedCaptureClockOffsetDuration() != -250*time.Millisecond {
83+
t.Fatalf("duration differs, want -250ms got %v", *o2.EstimatedCaptureClockOffsetDuration())
84+
}
85+
})
4686
}

0 commit comments

Comments
 (0)
Please sign in to comment.