From b9894ab0140548807b44a0b1701df7cfbb00a3a1 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Thu, 20 Oct 2022 14:31:19 +0530 Subject: [PATCH] Allocate packetMeta up front to reduce number of allocations. (#1108) --- pkg/sfu/forwarder.go | 2 +- pkg/sfu/sequencer.go | 40 +++++++++++++++++++++++++-------------- pkg/sfu/sequencer_test.go | 2 +- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 5c5d2a396..2118d2594 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -102,7 +102,7 @@ type VideoAllocation struct { } func (v VideoAllocation) String() string { - return fmt.Sprintf("VideoAllocation{state: %s, change: %s, bw: %d, del: %d, avail: %+v, exmpt: %+v, rates: %+v, target: %s, dist: %d}", + return fmt.Sprintf("VideoAllocation{state: %s, change: %s, bw: %d, del: %d, avail: %+v, exempt: %+v, rates: %+v, target: %s, dist: %d}", v.state, v.change, v.bandwidthRequested, v.bandwidthDelta, v.availableLayers, v.exemptedLayers, v.bitrates, v.targetLayers, v.distanceToDesired) } diff --git a/pkg/sfu/sequencer.go b/pkg/sfu/sequencer.go index 52ee2f54f..0fb7693af 100644 --- a/pkg/sfu/sequencer.go +++ b/pkg/sfu/sequencer.go @@ -93,23 +93,27 @@ func (p *packetMeta) unpackVP8() *buffer.VP8 { // Sequencer stores the packet sequence received by the down track type sequencer struct { sync.Mutex - init bool - max int - seq []*packetMeta - step int - headSN uint16 - startTime int64 - rtt uint32 - logger logger.Logger + init bool + max int + seq []*packetMeta + meta []packetMeta + metaWritePtr int + step int + headSN uint16 + startTime int64 + rtt uint32 + logger logger.Logger } func newSequencer(maxTrack int, maxPadding int, logger logger.Logger) *sequencer { return &sequencer{ - startTime: time.Now().UnixNano() / 1e6, - max: maxTrack + maxPadding, - seq: make([]*packetMeta, maxTrack+maxPadding), - rtt: defaultRtt, - logger: logger, + startTime: time.Now().UnixNano() / 1e6, + max: maxTrack + maxPadding, + seq: make([]*packetMeta, maxTrack+maxPadding), + meta: make([]packetMeta, maxTrack), + metaWritePtr: 0, + rtt: defaultRtt, + logger: logger, } } @@ -133,12 +137,20 @@ func (s *sequencer) push(sn, offSn uint16, timeStamp uint32, layer int8) *packet return nil } - s.seq[slot] = &packetMeta{ + s.meta[s.metaWritePtr] = packetMeta{ sourceSeqNo: sn, targetSeqNo: offSn, timestamp: timeStamp, layer: layer, } + + s.seq[slot] = &s.meta[s.metaWritePtr] + + s.metaWritePtr++ + if s.metaWritePtr >= len(s.meta) { + s.metaWritePtr -= len(s.meta) + } + return s.seq[slot] } diff --git a/pkg/sfu/sequencer_test.go b/pkg/sfu/sequencer_test.go index 8a3eb0644..f0fb9a54c 100644 --- a/pkg/sfu/sequencer_test.go +++ b/pkg/sfu/sequencer_test.go @@ -84,7 +84,7 @@ func Test_sequencer_getNACKSeqNo(t *testing.T) { for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { - n := newSequencer(500, 0, logger.GetDefaultLogger()) + n := newSequencer(5, 10, logger.GetDefaultLogger()) for _, i := range tt.fields.input { n.push(i, i+tt.fields.offset, 123, 3)