@@ -21,25 +21,78 @@ import (
2121 "github.com/pion/rtcp"
2222)
2323
24+ const (
25+ DefaultMaxTsDiff = time .Minute
26+ )
27+
28+ type SynchronizerOption func (* SynchronizerConfig )
29+
30+ // SynchronizerConfig holds configuration for the Synchronizer
31+ type SynchronizerConfig struct {
32+ MaxTsDiff time.Duration
33+ OnStarted func ()
34+ }
35+
36+ // WithMaxTsDiff sets the maximum acceptable difference between RTP packets
37+ // In case exceeded the synchronizer will adjust the PTS offset to keep the audio and video in sync
38+ func WithMaxTsDiff (maxTsDiff time.Duration ) SynchronizerOption {
39+ return func (config * SynchronizerConfig ) {
40+ config .MaxTsDiff = maxTsDiff
41+ }
42+ }
43+
44+ // WithOnStarted sets the callback to be called when the synchronizer starts
45+ func WithOnStarted (onStarted func ()) SynchronizerOption {
46+ return func (config * SynchronizerConfig ) {
47+ config .OnStarted = onStarted
48+ }
49+ }
50+
2451// a single Synchronizer is shared between all audio and video writers
2552type Synchronizer struct {
2653 sync.RWMutex
2754
2855 startedAt int64
2956 onStarted func ()
3057 endedAt int64
58+ config SynchronizerConfig
3159
3260 psByIdentity map [string ]* participantSynchronizer
3361 psBySSRC map [uint32 ]* participantSynchronizer
3462 ssrcByID map [string ]uint32
3563}
3664
3765func NewSynchronizer (onStarted func ()) * Synchronizer {
66+ config := SynchronizerConfig {
67+ MaxTsDiff : DefaultMaxTsDiff ,
68+ OnStarted : onStarted ,
69+ }
70+
71+ return & Synchronizer {
72+ onStarted : config .OnStarted ,
73+ psByIdentity : make (map [string ]* participantSynchronizer ),
74+ psBySSRC : make (map [uint32 ]* participantSynchronizer ),
75+ ssrcByID : make (map [string ]uint32 ),
76+ config : config ,
77+ }
78+ }
79+
80+ func NewSynchronizerWithOptions (opts ... SynchronizerOption ) * Synchronizer {
81+ config := SynchronizerConfig {
82+ MaxTsDiff : DefaultMaxTsDiff ,
83+ OnStarted : nil ,
84+ }
85+
86+ for _ , opt := range opts {
87+ opt (& config )
88+ }
89+
3890 return & Synchronizer {
39- onStarted : onStarted ,
91+ onStarted : config . OnStarted ,
4092 psByIdentity : make (map [string ]* participantSynchronizer ),
4193 psBySSRC : make (map [uint32 ]* participantSynchronizer ),
4294 ssrcByID : make (map [string ]uint32 ),
95+ config : config ,
4396 }
4497}
4598
0 commit comments