Skip to content

Commit 59b5d97

Browse files
authored
config to enable jitter buffer (#312)
1 parent 0e9ff8d commit 59b5d97

File tree

8 files changed

+35
-24
lines changed

8 files changed

+35
-24
lines changed

pkg/config/config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ type Config struct {
8888
HideInboundPort bool `yaml:"hide_inbound_port"`
8989

9090
// AudioDTMF forces SIP to generate audio DTMF tones in addition to digital.
91-
AudioDTMF bool `yaml:"audio_dtmf"`
91+
AudioDTMF bool `yaml:"audio_dtmf"`
92+
EnableJitterBuffer bool `yaml:"enable_jitter_buffer"`
9293

9394
// internal
9495
ServiceName string `yaml:"-"`

pkg/media/rtp/jitter.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,10 @@ import (
2323
)
2424

2525
const (
26-
jitterEnabled = false
2726
jitterMaxLatency = 60 * time.Millisecond // should match mixer's target buffer size
2827
)
2928

3029
func HandleJitter(clockRate int, h Handler) Handler {
31-
if !jitterEnabled {
32-
return h
33-
}
3430
return &jitterHandler{
3531
h: h,
3632
buf: jitter.NewBuffer(audioDepacketizer{}, uint32(clockRate), jitterMaxLatency),

pkg/sip/inbound.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@ package sip
1717
import (
1818
"context"
1919
"fmt"
20-
"github.com/livekit/protocol/rpc"
2120
"math"
2221
"net/netip"
2322
"slices"
2423
"sync"
2524
"sync/atomic"
2625
"time"
2726

27+
"github.com/livekit/protocol/rpc"
28+
2829
"github.com/frostbyte73/core"
2930
"github.com/icholy/digest"
3031
"github.com/pkg/errors"
@@ -544,6 +545,7 @@ func (c *inboundCall) runMediaConn(offerData []byte, conf *config.Config, featur
544545
Ports: conf.RTPPort,
545546
MediaTimeoutInitial: c.s.conf.MediaTimeoutInitial,
546547
MediaTimeout: c.s.conf.MediaTimeout,
548+
EnableJitterBuffer: c.s.conf.EnableJitterBuffer,
547549
}, RoomSampleRate)
548550
if err != nil {
549551
return nil, err

pkg/sip/media_port.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type MediaConfig struct {
4343
Ports rtcconfig.PortRange
4444
MediaTimeoutInitial time.Duration
4545
MediaTimeout time.Duration
46+
EnableJitterBuffer bool
4647
}
4748

4849
func NewMediaPort(log logger.Logger, mon *stats.CallMonitor, conf *MediaConfig, sampleRate int) (*MediaPort, error) {
@@ -52,10 +53,11 @@ func NewMediaPort(log logger.Logger, mon *stats.CallMonitor, conf *MediaConfig,
5253
func NewMediaPortWith(log logger.Logger, mon *stats.CallMonitor, conn rtp.UDPConn, conf *MediaConfig, sampleRate int) (*MediaPort, error) {
5354
mediaTimeout := make(chan struct{})
5455
p := &MediaPort{
55-
log: log,
56-
mon: mon,
57-
externalIP: conf.IP,
58-
mediaTimeout: mediaTimeout,
56+
log: log,
57+
mon: mon,
58+
externalIP: conf.IP,
59+
mediaTimeout: mediaTimeout,
60+
jitterEnabled: conf.EnableJitterBuffer,
5961
conn: rtp.NewConnWith(conn, &rtp.ConnConfig{
6062
MediaTimeoutInitial: conf.MediaTimeoutInitial,
6163
MediaTimeout: conf.MediaTimeout,
@@ -81,6 +83,7 @@ type MediaPort struct {
8183
conn *rtp.Conn
8284
mediaTimeout <-chan struct{}
8385
dtmfAudioEnabled bool
86+
jitterEnabled bool
8487
closed atomic.Bool
8588

8689
mu sync.Mutex
@@ -236,7 +239,9 @@ func (p *MediaPort) setupInput() {
236239
// Decoding pipeline (SIP -> LK)
237240
audioHandler := p.conf.Audio.Codec.DecodeRTP(p.audioIn, p.conf.Audio.Type)
238241
p.audioInHandler = audioHandler
239-
audioHandler = rtp.HandleJitter(p.conf.Audio.Codec.Info().RTPClockRate, audioHandler)
242+
if p.jitterEnabled {
243+
audioHandler = rtp.HandleJitter(p.conf.Audio.Codec.Info().RTPClockRate, audioHandler)
244+
}
240245
mux := rtp.NewMux(nil)
241246
mux.SetDefault(newRTPStatsHandler(p.mon, "", nil))
242247
mux.Register(p.conf.Audio.Type, newRTPStatsHandler(p.mon, p.conf.Audio.Codec.Info().SDPName, audioHandler))

pkg/sip/outbound.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ func (c *Client) newCall(ctx context.Context, conf *config.Config, log logger.Lo
122122
Ports: conf.RTPPort,
123123
MediaTimeoutInitial: c.conf.MediaTimeoutInitial,
124124
MediaTimeout: c.conf.MediaTimeout,
125+
EnableJitterBuffer: c.conf.EnableJitterBuffer,
125126
}, RoomSampleRate)
126127
if err != nil {
127128
call.close(errors.Wrap(err, "media failed"), callDropped, "media-failed", livekit.DisconnectReason_UNKNOWN_REASON)

pkg/sip/room.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,9 @@ func (r *Room) Connect(conf *config.Config, rconf RoomConfig) error {
207207
defer odec.Close()
208208

209209
var h rtp.Handler = rtp.NewMediaStreamIn[opus.Sample](odec)
210-
h = rtp.HandleJitter(int(track.Codec().ClockRate), h)
210+
if conf.EnableJitterBuffer {
211+
h = rtp.HandleJitter(int(track.Codec().ClockRate), h)
212+
}
211213
err = rtp.HandleLoop(track, h)
212214
if err != nil && !errors.Is(err, io.EOF) {
213215
log.Infow("room track rtp handler returned with failure", "error", err)

test/integration/sip_test.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,19 @@ func runSIPServer(t testing.TB, lk *LiveKit) *SIPServer {
5959
local, err := config.GetLocalIP()
6060
require.NoError(t, err)
6161
conf := &config.Config{
62-
NodeID: utils.NewGuid("NS_"),
63-
ApiKey: lk.ApiKey,
64-
ApiSecret: lk.ApiSecret,
65-
WsUrl: lk.WsUrl,
66-
Redis: lk.Redis,
67-
SIPPort: sipPort,
68-
SIPPortListen: sipPort,
69-
ListenIP: local.String(),
70-
RTPPort: rtcconfig.PortRange{Start: 20000, End: 20010},
71-
UseExternalIP: false,
72-
MaxCpuUtilization: 0.9,
73-
Logging: logger.Config{Level: "debug"},
62+
NodeID: utils.NewGuid("NS_"),
63+
ApiKey: lk.ApiKey,
64+
ApiSecret: lk.ApiSecret,
65+
WsUrl: lk.WsUrl,
66+
Redis: lk.Redis,
67+
SIPPort: sipPort,
68+
SIPPortListen: sipPort,
69+
ListenIP: local.String(),
70+
RTPPort: rtcconfig.PortRange{Start: 20000, End: 20010},
71+
UseExternalIP: false,
72+
MaxCpuUtilization: 0.9,
73+
Logging: logger.Config{Level: "debug"},
74+
EnableJitterBuffer: true,
7475
}
7576
_ = conf.InitLogger()
7677
log := logger.GetLogger()

test/lktest/sip.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,5 +340,8 @@ Check logs for call:
340340
if !params.NoDMTF {
341341
t.Log("testing dtmf")
342342
CheckDTMFForParticipants(t, ctx, pOut, pIn, dataOut, dataIn)
343+
344+
t.Log("retesting audio")
345+
CheckAudioForParticipants(t, ctx, pOut, pIn)
343346
}
344347
}

0 commit comments

Comments
 (0)