@@ -3,6 +3,7 @@ package media
3
3
import (
4
4
"sync"
5
5
"testing"
6
+ "time"
6
7
7
8
"github.com/pion/webrtc/v4"
8
9
"github.com/stretchr/testify/require"
@@ -34,7 +35,7 @@ func TestRTPSegmenterQueueLimit(t *testing.T) {
34
35
35
36
require := require .New (t )
36
37
ssr := NewSwitchableSegmentReader ()
37
- seg := NewRTPSegmenter ([]RTPTrack {videoTrack , audioTrack }, ssr )
38
+ seg := NewRTPSegmenter ([]RTPTrack {videoTrack , audioTrack }, ssr , 0 )
38
39
seg .StartSegment (0 )
39
40
40
41
// Override maxQueueSize for testing
@@ -81,7 +82,7 @@ func TestRTPSegmenterQueueLimit(t *testing.T) {
81
82
func TestRTPSegmenterVideoOnly (t * testing.T ) {
82
83
require := require .New (t )
83
84
ssr := NewSwitchableSegmentReader ()
84
- seg := NewRTPSegmenter ([]RTPTrack {videoTrack }, ssr )
85
+ seg := NewRTPSegmenter ([]RTPTrack {videoTrack }, ssr , 0 )
85
86
86
87
// Verify we have video but no audio
87
88
require .True (seg .hasVideo )
@@ -107,7 +108,7 @@ func TestRTPSegmenterVideoOnly(t *testing.T) {
107
108
func TestRTPSegmenterAudioOnly (t * testing.T ) {
108
109
require := require .New (t )
109
110
ssr := NewSwitchableSegmentReader ()
110
- seg := NewRTPSegmenter ([]RTPTrack {audioTrack }, ssr )
111
+ seg := NewRTPSegmenter ([]RTPTrack {audioTrack }, ssr , 0 )
111
112
112
113
// Verify we have audio but no video
113
114
require .True (seg .hasAudio )
@@ -133,7 +134,7 @@ func TestRTPSegmenterAudioOnly(t *testing.T) {
133
134
func TestRTPSegmenterConcurrency (t * testing.T ) {
134
135
require := require .New (t )
135
136
ssr := NewSwitchableSegmentReader ()
136
- seg := NewRTPSegmenter ([]RTPTrack {videoTrack , audioTrack }, ssr )
137
+ seg := NewRTPSegmenter ([]RTPTrack {videoTrack , audioTrack }, ssr , 0 )
137
138
138
139
// Start a segment
139
140
seg .StartSegment (0 )
@@ -179,7 +180,7 @@ func TestRTPSegmenterConcurrency(t *testing.T) {
179
180
func TestRTPSegmenterLatePacketDropping (t * testing.T ) {
180
181
require := require .New (t )
181
182
ssr := NewSwitchableSegmentReader ()
182
- seg := NewRTPSegmenter ([]RTPTrack {videoTrack , audioTrack }, ssr )
183
+ seg := NewRTPSegmenter ([]RTPTrack {videoTrack , audioTrack }, ssr , 0 )
183
184
184
185
// Start a segment
185
186
seg .StartSegment (0 )
@@ -228,3 +229,57 @@ func TestRTPSegmenterLatePacketDropping(t *testing.T) {
228
229
// Verify low watermark is updated
229
230
require .Equal (int64 (7000 ), seg .videoQueue [0 ].pts )
230
231
}
232
+
233
+ func TestRTPSegmenterMinSegmentDurationWallClock (t * testing.T ) {
234
+ require := require .New (t )
235
+
236
+ ssr := NewSwitchableSegmentReader ()
237
+ // Use a short minSegDur so we don't slow tests too much
238
+ minSegDur := 100 * time .Millisecond
239
+ seg := NewRTPSegmenter ([]RTPTrack {videoTrack }, ssr , minSegDur )
240
+
241
+ // Initially no segment
242
+ require .False (seg .IsReady (), "No active segment yet" )
243
+
244
+ // Start an initial segment
245
+ seg .StartSegment (0 )
246
+ require .True (seg .IsReady (), "Segment should be started" )
247
+
248
+ // Immediately check if we should start a new segment
249
+ // Not enough wall time has passed
250
+ shouldStart := seg .ShouldStartSegment (1 , 1 ) // ~1 second in 1hz timescale
251
+ require .False (shouldStart , "Should not start new segment (wall-clock < minDur)" )
252
+
253
+ // Wait less than the minSegDur, ensure we still don't start
254
+ time .Sleep (minSegDur / 2 )
255
+ shouldStart = seg .ShouldStartSegment (2 , 1 ) // ~2 seconds
256
+ require .False (shouldStart , "Still under the wall-clock limit" )
257
+
258
+ // Wait enough time, then we can start a new segment
259
+ time .Sleep (minSegDur / 2 )
260
+ shouldStart = seg .ShouldStartSegment (3 , 1 ) // ~3 seconds PTS
261
+ require .True (shouldStart , "Segment should have started" )
262
+ }
263
+
264
+ func TestRTPSegmenterMinSegmentDurationPTS (t * testing.T ) {
265
+ require := require .New (t )
266
+ ssr := NewSwitchableSegmentReader ()
267
+
268
+ // 1 second min
269
+ minSegDur := 10 * time .Millisecond
270
+ seg := NewRTPSegmenter ([]RTPTrack {videoTrack }, ssr , minSegDur )
271
+
272
+ // Start initial segment at pts=0
273
+ seg .StartSegment (0 )
274
+ require .True (seg .IsReady (), "Segment should be active" )
275
+
276
+ // Even if we wait in real clock, if PTS is still less than 1s, no new segment
277
+ time .Sleep (minSegDur )
278
+ require .False (seg .ShouldStartSegment (9 , 1000 )) // 9ms < 10ms minSegDur
279
+ require .True (seg .ShouldStartSegment (10 , 1000 )) // 10ms == minSegDur
280
+
281
+ seg .StartSegment (12 )
282
+ time .Sleep (minSegDur ) // because we also check the wall clock
283
+ require .False (seg .ShouldStartSegment (20 , 1000 ), "PTS" ) // 20ms < 22ms (12ms start + 10ms minSegDur)
284
+ require .True (seg .ShouldStartSegment (23 , 1000 ), "PTS" ) // 23ms > 22ms
285
+ }
0 commit comments