@@ -3,6 +3,7 @@ package media
3
3
import (
4
4
"errors"
5
5
"sync"
6
+ "time"
6
7
7
8
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
8
9
"github.com/pion/webrtc/v4"
@@ -26,6 +27,10 @@ type RTPSegmenter struct {
26
27
hasVideo bool
27
28
maxQueueSize int // Maximum number of packets to buffer per queue
28
29
tsWatermark int64 // Timestamp of the last written packet
30
+
31
+ segStartTs int64 // timestamp of the current segment
32
+ segStartTime time.Time // wall clock of when the current segment started
33
+ minSegDur time.Duration // minimum segment duration
29
34
}
30
35
31
36
type audioPacket struct {
@@ -47,10 +52,11 @@ type trackWriter struct {
47
52
writeVideo func (pts , dts int64 , data [][]byte ) error
48
53
}
49
54
50
- func NewRTPSegmenter (tracks []RTPTrack , ssr * SwitchableSegmentReader ) * RTPSegmenter {
55
+ func NewRTPSegmenter (tracks []RTPTrack , ssr * SwitchableSegmentReader , segDur time. Duration ) * RTPSegmenter {
51
56
s := & RTPSegmenter {
52
57
ssr : ssr ,
53
58
maxQueueSize : 20 ,
59
+ minSegDur : segDur ,
54
60
}
55
61
s .tracks = s .setupTracks (tracks )
56
62
return s
@@ -73,7 +79,28 @@ func (s *RTPSegmenter) StartSegment(startTs int64) {
73
79
s .mpegtsWriter = mpegts .NewWriter (writer , newTracks )
74
80
s .ssr .Read (writer .MakeReader ())
75
81
s .mediaWriter = writer
82
+ s .segStartTs = startTs
83
+ s .segStartTime = time .Now ()
76
84
}
85
+
86
+ func (s * RTPSegmenter ) ShouldStartSegment (pts int64 , tb uint32 ) bool {
87
+ s .mu .Lock ()
88
+ defer s .mu .Unlock ()
89
+ if s .segStartTime .IsZero () {
90
+ return true
91
+ }
92
+ // Enforce minimum real (wall-clock) time
93
+ if time .Since (s .segStartTime ) < s .minSegDur {
94
+ return false
95
+ }
96
+ // Enforce minimum PTS time
97
+ needed := int64 (s .minSegDur .Seconds () * float64 (tb ))
98
+ if (pts - s .segStartTs ) < needed {
99
+ return false
100
+ }
101
+ return true
102
+ }
103
+
77
104
func (s * RTPSegmenter ) WriteVideo (source RTPTrack , pts , dts int64 , au [][]byte ) error {
78
105
s .mu .Lock ()
79
106
defer s .mu .Unlock ()
0 commit comments