mirror of
https://github.com/livekit/livekit.git
synced 2026-10-23 21:44:29 +00:00
* Reduce descriptor marshal allocations on Go 1.26.4/linux-amd64 Signed-off-by: Perfloop Agent <agent@perfloop.ai> * Use require in the descriptor marshal benchmark test Signed-off-by: Perfloop Agent <agent@perfloop.ai> * sfu: marshal dependency descriptors into caller-owned scratch * sfu: reuse the selector's descriptor clone * sfu: share one inline header-extension size constant --------- Signed-off-by: Perfloop Agent <agent@perfloop.ai>
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
// Copyright 2023 LiveKit, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package pacer
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/livekit/livekit-server/pkg/sfu/ccutils"
|
|
dd "github.com/livekit/livekit-server/pkg/sfu/rtpextension/dependencydescriptor"
|
|
"github.com/pion/rtp"
|
|
"github.com/pion/webrtc/v4"
|
|
)
|
|
|
|
var (
|
|
PacketFactory = &sync.Pool{
|
|
New: func() any {
|
|
return &Packet{}
|
|
},
|
|
}
|
|
)
|
|
|
|
// --------------------------------------
|
|
|
|
type PacerBehavior string
|
|
|
|
const (
|
|
PacerBehaviorPassThrough PacerBehavior = "pass-through"
|
|
PacerBehaviorNoQueue PacerBehavior = "no-queue"
|
|
PacerBehaviorLeakybucket PacerBehavior = "leaky-bucket"
|
|
)
|
|
|
|
type Packet struct {
|
|
Header *rtp.Header
|
|
HeaderPool *sync.Pool
|
|
HeaderSize int
|
|
Payload []byte
|
|
IsRTX bool
|
|
ProbeClusterId ccutils.ProbeClusterId
|
|
IsProbe bool
|
|
AbsSendTimeExtID uint8
|
|
TransportWideExtID uint8
|
|
WriteStream webrtc.TrackLocalWriter
|
|
Pool *sync.Pool
|
|
PoolEntity *[]byte
|
|
|
|
// per-packet scratch for header extensions patched at send time,
|
|
// the Packet is owned by one send until SendPacket returns
|
|
absSendTimeBuf [3]byte
|
|
twccBuf [2]byte
|
|
extBuf [dd.MaxInlineExtensionSize]byte
|
|
}
|
|
|
|
// HoldExtension copies ext into scratch the header can point at until SendPacket returns, nil if it does not fit
|
|
func (p *Packet) HoldExtension(ext []byte) []byte {
|
|
if len(ext) > len(p.extBuf) {
|
|
return nil
|
|
}
|
|
return p.extBuf[:copy(p.extBuf[:], ext)]
|
|
}
|
|
|
|
type Pacer interface {
|
|
Enqueue(p *Packet)
|
|
Stop()
|
|
|
|
SetInterval(interval time.Duration)
|
|
SetBitrate(bitrate int)
|
|
|
|
TimeSinceLastSentPacket() time.Duration
|
|
|
|
SetPacerProbeObserverListener(listener PacerProbeObserverListener)
|
|
StartProbeCluster(pci ccutils.ProbeClusterInfo)
|
|
EndProbeCluster(probeClusterId ccutils.ProbeClusterId) ccutils.ProbeClusterInfo
|
|
}
|
|
|
|
type PacerProbeObserverListener interface {
|
|
OnPacerProbeObserverClusterComplete(probeClusterId ccutils.ProbeClusterId)
|
|
}
|
|
|
|
// ------------------------------------------------
|