sfu

package
v1.9.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 1, 2026 License: Apache-2.0 Imports: 42 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RTPPaddingMaxPayloadSize      = 255
	RTPPaddingEstimatedHeaderSize = 20
	RTPBlankFramesMuteSeconds     = float32(1.0)
	RTPBlankFramesCloseSeconds    = float32(0.2)

	FlagStopRTXOnPLI = true
)
View Source
const (
	FlagPauseOnDowngrade  = true
	FlagFilterRTX         = false
	FlagFilterRTXLayers   = true
	TransitionCostSpatial = 10

	ResumeBehindThresholdSeconds      = float64(0.2)   // 200ms
	ResumeBehindHighThresholdSeconds  = float64(2.0)   // 2 seconds
	LayerSwitchBehindThresholdSeconds = float64(0.05)  // 50ms
	SwitchAheadThresholdSeconds       = float64(0.025) // 25ms
)
View Source
const (
	RtxGateWindow = 2000
)

Variables

View Source
var (
	VP8KeyFrame8x8 = []byte{
		0x10, 0x02, 0x00, 0x9d, 0x01, 0x2a, 0x08, 0x00,
		0x08, 0x00, 0x00, 0x47, 0x08, 0x85, 0x85, 0x88,
		0x85, 0x84, 0x88, 0x02, 0x02, 0x00, 0x0c, 0x0d,
		0x60, 0x00, 0xfe, 0xff, 0xab, 0x50, 0x80,
	}

	H264KeyFrame2x2SPS = []byte{
		0x67, 0x42, 0xc0, 0x1f, 0x0f, 0xd9, 0x1f, 0x88,
		0x88, 0x84, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,
		0x00, 0x03, 0x00, 0xc8, 0x3c, 0x60, 0xc9, 0x20,
	}
	H264KeyFrame2x2PPS = []byte{
		0x68, 0x87, 0xcb, 0x83, 0xcb, 0x20,
	}
	H264KeyFrame2x2IDR = []byte{
		0x65, 0x88, 0x84, 0x0a, 0xf2, 0x62, 0x80, 0x00,
		0xa7, 0xbe,
	}
	H264KeyFrame2x2 = [][]byte{H264KeyFrame2x2SPS, H264KeyFrame2x2PPS, H264KeyFrame2x2IDR}

	OpusSilenceFrame = []byte{
		0xf8, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	}
)
View Source
var (
	ErrReceiverClosed        = errors.New("receiver closed")
	ErrDownTrackAlreadyExist = errors.New("DownTrack already exist")
	ErrDuplicateLayer        = errors.New("duplicate layer")
	ErrInvalidLayer          = errors.New("invalid layer")
)
View Source
var (
	ErrIncompleteRedHeader = errors.New("incomplete red block header")
	ErrIncompleteRedBlock  = errors.New("incomplete red block payload")
)
View Source
var (
	PacketFactory = &sync.Pool{
		New: func() any {
			b := make([]byte, 1460)
			return &b
		},
	}

	RTPHeaderFactory = &sync.Pool{
		New: func() any {
			return &rtp.Header{}
		},
	}
)
View Source
var (
	DefaultStreamTrackerConfigVideo = StreamTrackerConfig{
		StreamTrackerType: StreamTrackerTypePacket,
		BitrateReportInterval: map[int32]time.Duration{
			0: 1 * time.Second,
			1: 1 * time.Second,
			2: 1 * time.Second,
		},
		PacketTracker: streamtracker.DefaultStreamTrackerPacketConfigVideo,
		FrameTracker:  streamtracker.DefaultStreamTrackerFrameConfigVideo,
	}

	DefaultStreamTrackerConfigScreenshare = StreamTrackerConfig{
		StreamTrackerType: StreamTrackerTypePacket,
		BitrateReportInterval: map[int32]time.Duration{
			0: 4 * time.Second,
			1: 4 * time.Second,
			2: 4 * time.Second,
		},
		PacketTracker: streamtracker.DefaultStreamTrackerPacketConfigScreenshare,
		FrameTracker:  streamtracker.DefaultStreamTrackerFrameConfigScreenshare,
	}
)
View Source
var (
	DefaultAudioConfig = AudioConfig{
		AudioLevelConfig: audio.DefaultAudioLevelConfig,
	}
)
View Source
var (
	DefaultPLIThrottleConfig = PLIThrottleConfig{
		LowQuality:  500 * time.Millisecond,
		MidQuality:  time.Second,
		HighQuality: time.Second,
	}
)
View Source
var (
	DefaultStreamTrackerManagerConfig = StreamTrackerManagerConfig{
		Video:       DefaultStreamTrackerConfigVideo,
		Screenshare: DefaultStreamTrackerConfigScreenshare,
	}
)
View Source
var (
	VideoAllocationDefault = VideoAllocation{
		PauseReason:         VideoPauseReasonFeedDry,
		TargetLayer:         buffer.InvalidLayer,
		RequestLayerSpatial: buffer.InvalidLayerSpatial,
		MaxLayer:            buffer.InvalidLayer,
	}
)

Functions

This section is empty.

Types

type AudioConfig added in v1.8.1

type AudioConfig struct {
	audio.AudioLevelConfig `yaml:",inline"`

	// enable red encoding downtrack for opus only audio up track
	ActiveREDEncoding bool `yaml:"active_red_encoding,omitempty"`
	// enable proxying weakest subscriber loss to publisher in RTCP Receiver Report
	EnableLossProxying bool `yaml:"enable_loss_proxying,omitempty"`
}

type Bitrates added in v0.15.0

type DownTrack

type DownTrack struct {
	// contains filtered or unexported fields
}

DownTrack implements webrtc.TrackLocal, is the track used to write packets to SFU Subscriber, the track handle the packets for simple, simulcast and SVC Publisher. A DownTrack has the following lifecycle - new - bound / unbound - closed once closed, a DownTrack cannot be re-used.

func NewDownTrack

func NewDownTrack(params DownTrackParams) (*DownTrack, error)

NewDownTrack returns a DownTrack.

func (*DownTrack) AddReceiverReportListener

func (d *DownTrack) AddReceiverReportListener(listener ReceiverReportListener)

func (*DownTrack) AllocateNextHigher added in v0.15.0

func (d *DownTrack) AllocateNextHigher(availableChannelCapacity int64, allowOvershoot bool) (VideoAllocation, bool)

func (*DownTrack) AllocateOptimal added in v0.15.6

func (d *DownTrack) AllocateOptimal(allowOvershoot bool, hold bool) VideoAllocation

func (*DownTrack) BandwidthRequested added in v0.15.0

func (d *DownTrack) BandwidthRequested() int64

func (*DownTrack) Bind

Bind is called by the PeerConnection after negotiation is complete This asserts that the code requested is supported by the remote peer. If so it sets up all the state (SSRC and PayloadType) to have a call

func (*DownTrack) Close

func (d *DownTrack) Close()

func (*DownTrack) CloseWithFlush added in v0.15.3

func (d *DownTrack) CloseWithFlush(flush bool, isEnding bool)

CloseWithFlush - flush used to indicate whether send blank frame to flush decoder of client.

  1. When transceiver is reused by other participant's video track, set flush=true to avoid previous video shows before new stream is displayed.
  2. in case of session migration, participant migrate from other node, video track should be resumed with same participant, set flush=false since we don't need to flush decoder.

func (*DownTrack) Codec

func (d *DownTrack) Codec() webrtc.RTPCodecCapability

Codec returns current track codec capability

func (*DownTrack) CreateSenderReport

func (d *DownTrack) CreateSenderReport() *rtcp.SenderReport

func (*DownTrack) CreateSourceDescriptionChunks

func (d *DownTrack) CreateSourceDescriptionChunks() []rtcp.SourceDescriptionChunk

func (*DownTrack) DebugInfo

func (d *DownTrack) DebugInfo() map[string]any

func (*DownTrack) DistanceToDesired added in v0.15.0

func (d *DownTrack) DistanceToDesired() float64

func (*DownTrack) EnableForwardPacketArrivalTime added in v1.9.10

func (d *DownTrack) EnableForwardPacketArrivalTime(_enable bool)

func (*DownTrack) GetConnectionScoreAndQuality added in v1.4.0

func (d *DownTrack) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality)

func (*DownTrack) GetDeltaStatsSender added in v1.5.0

func (d *DownTrack) GetDeltaStatsSender() map[uint32]*buffer.StreamStatsWithLayers

func (*DownTrack) GetNackStats added in v0.15.5

func (d *DownTrack) GetNackStats() (totalPackets uint32, totalRepeatedNACKs uint32)

func (*DownTrack) GetNextHigherTransition added in v0.15.5

func (d *DownTrack) GetNextHigherTransition(allowOvershoot bool) (VideoTransition, bool)

func (*DownTrack) GetPrimaryStreamLastReceiverReportTime added in v1.8.1

func (d *DownTrack) GetPrimaryStreamLastReceiverReportTime() time.Time

func (*DownTrack) GetPrimaryStreamPacketsSent added in v1.8.1

func (d *DownTrack) GetPrimaryStreamPacketsSent() uint64

func (*DownTrack) GetState added in v1.2.4

func (d *DownTrack) GetState() DownTrackState

func (*DownTrack) GetTrackStats added in v0.15.6

func (d *DownTrack) GetTrackStats() *livekit.RTPStats

func (*DownTrack) GetTransceiver added in v1.1.1

func (d *DownTrack) GetTransceiver() *webrtc.RTPTransceiver

func (*DownTrack) HandleRTCPSenderReportData added in v1.3.3

func (d *DownTrack) HandleRTCPSenderReportData(
	_payloadType webrtc.PayloadType,
	layer int32,
	publisherSRData *livekit.RTCPSenderReportState,
) error

func (*DownTrack) ID

func (d *DownTrack) ID() string

ID is the unique identifier for this Track. This should be unique for the stream, but doesn't have to globally unique. A common example would be 'audio' or 'video' and StreamID would be 'desktop' or 'webcam'

func (*DownTrack) IsClosed added in v1.1.0

func (d *DownTrack) IsClosed() bool

func (*DownTrack) IsDeficient added in v0.15.0

func (d *DownTrack) IsDeficient() bool

func (*DownTrack) Kind

func (d *DownTrack) Kind() webrtc.RTPCodecType

Kind controls if this TrackLocal is audio or video

func (*DownTrack) MaxLayer added in v1.4.2

func (d *DownTrack) MaxLayer() buffer.VideoLayer

func (*DownTrack) Mime added in v1.8.4

func (d *DownTrack) Mime() mime.MimeType

func (*DownTrack) Mute

func (d *DownTrack) Mute(muted bool)

Mute enables or disables media forwarding - subscriber triggered

func (*DownTrack) OnBinding added in v1.3.4

func (d *DownTrack) OnBinding(fn func(error))

func (*DownTrack) Pause added in v0.15.0

func (d *DownTrack) Pause() VideoAllocation

func (*DownTrack) ProvisionalAllocate added in v0.15.0

func (d *DownTrack) ProvisionalAllocate(availableChannelCapacity int64, layers buffer.VideoLayer, allowPause bool, allowOvershoot bool) (bool, int64)

func (*DownTrack) ProvisionalAllocateCommit added in v0.15.0

func (d *DownTrack) ProvisionalAllocateCommit() VideoAllocation

func (*DownTrack) ProvisionalAllocateGetBestWeightedTransition added in v0.15.0

func (d *DownTrack) ProvisionalAllocateGetBestWeightedTransition() VideoTransition

func (*DownTrack) ProvisionalAllocateGetCooperativeTransition added in v0.15.0

func (d *DownTrack) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) VideoTransition

func (*DownTrack) ProvisionalAllocatePrepare added in v0.15.0

func (d *DownTrack) ProvisionalAllocatePrepare()

func (*DownTrack) ProvisionalAllocateReset added in v1.4.5

func (d *DownTrack) ProvisionalAllocateReset()

func (*DownTrack) PubMute added in v1.3.4

func (d *DownTrack) PubMute(pubMuted bool)

PubMute enables or disables media forwarding - publisher side

func (*DownTrack) RID added in v0.15.3

func (d *DownTrack) RID() string

RID is required by `webrtc.TrackLocal` interface

func (*DownTrack) Receiver added in v1.8.4

func (d *DownTrack) Receiver() TrackReceiver

func (*DownTrack) ReceiverRestart added in v1.9.9

func (d *DownTrack) ReceiverRestart()

func (*DownTrack) Resync added in v0.15.4

func (d *DownTrack) Resync()

func (*DownTrack) SSRC

func (d *DownTrack) SSRC() uint32

func (*DownTrack) SSRCRTX added in v1.8.1

func (d *DownTrack) SSRCRTX() uint32

func (*DownTrack) SeedState added in v1.2.4

func (d *DownTrack) SeedState(state DownTrackState)

func (*DownTrack) SetActivePaddingOnMuteUpTrack added in v1.3.3

func (d *DownTrack) SetActivePaddingOnMuteUpTrack()

SetActivePaddingOnMuteUpTrack will enable padding on the track when its uptrack is muted. Pion will not fire OnTrack event until it receives packet for the track, so we send padding packets to help pion client (go-sdk) to fire the event.

func (*DownTrack) SetConnected added in v1.1.0

func (d *DownTrack) SetConnected()

func (*DownTrack) SetMaxSpatialLayer added in v0.15.0

func (d *DownTrack) SetMaxSpatialLayer(spatialLayer int32)

func (*DownTrack) SetMaxTemporalLayer added in v0.15.0

func (d *DownTrack) SetMaxTemporalLayer(temporalLayer int32)

func (*DownTrack) SetProbeClusterId added in v1.8.1

func (d *DownTrack) SetProbeClusterId(probeClusterId ccutils.ProbeClusterId)

func (*DownTrack) SetReceiver added in v1.8.4

func (d *DownTrack) SetReceiver(r TrackReceiver)

func (*DownTrack) SetStreamAllocatorListener added in v1.4.0

func (d *DownTrack) SetStreamAllocatorListener(listener DownTrackStreamAllocatorListener)

func (*DownTrack) SetTransceiver

func (d *DownTrack) SetTransceiver(transceiver *webrtc.RTPTransceiver)

func (*DownTrack) StopWriteAndGetState added in v1.7.1

func (d *DownTrack) StopWriteAndGetState() DownTrackState

func (*DownTrack) StreamID

func (d *DownTrack) StreamID() string

StreamID is the group this track belongs too. This must be unique

func (*DownTrack) SubscriberID added in v1.1.0

func (d *DownTrack) SubscriberID() livekit.ParticipantID

func (*DownTrack) SwapProbeClusterId added in v1.8.1

func (d *DownTrack) SwapProbeClusterId(match ccutils.ProbeClusterId, swap ccutils.ProbeClusterId)

func (*DownTrack) Unbind

func (d *DownTrack) Unbind(_ webrtc.TrackLocalContext) error

Unbind implements the teardown logic when the track is no longer needed. This happens because a track has been stopped.

func (*DownTrack) UpTrackBitrateAvailabilityChange added in v0.15.6

func (d *DownTrack) UpTrackBitrateAvailabilityChange()

func (*DownTrack) UpTrackBitrateReport added in v1.4.0

func (d *DownTrack) UpTrackBitrateReport(availableLayers []int32, bitrates Bitrates)

func (*DownTrack) UpTrackLayersChange added in v0.15.3

func (d *DownTrack) UpTrackLayersChange()

func (*DownTrack) UpTrackMaxPublishedLayerChange added in v1.3.5

func (d *DownTrack) UpTrackMaxPublishedLayerChange(maxPublishedLayer int32)

func (*DownTrack) UpTrackMaxTemporalLayerSeenChange added in v1.4.0

func (d *DownTrack) UpTrackMaxTemporalLayerSeenChange(maxTemporalLayerSeen int32)

func (*DownTrack) WritePaddingRTP

func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool, forceMarker bool) int

WritePaddingRTP tries to write as many padding only RTP packets as necessary to satisfy given size to the DownTrack

func (*DownTrack) WriteProbePackets added in v1.8.1

func (d *DownTrack) WriteProbePackets(bytesToSend int, usePadding bool) int

func (*DownTrack) WriteRTP

func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) int32

WriteRTP writes an RTP Packet to the DownTrack

type DownTrackListener added in v1.9.2

type DownTrackListener interface {
	OnBindAndConnected()
	OnStatsUpdate(stat *livekit.AnalyticsStat)
	OnMaxSubscribedLayerChanged(layer int32)
	OnRttUpdate(rtt uint32)
	OnCodecNegotiated(webrtc.RTPCodecCapability)
	OnDownTrackClose(isExpectedToResume bool)
}

type DownTrackParams added in v1.9.2

type DownTrackParams struct {
	Codecs                         []webrtc.RTPCodecParameters
	IsEncrypted                    bool
	Source                         livekit.TrackSource
	Receiver                       TrackReceiver
	BufferFactory                  *buffer.Factory
	SubID                          livekit.ParticipantID
	StreamID                       string
	MaxTrack                       int
	PlayoutDelayLimit              *livekit.PlayoutDelay
	Pacer                          pacer.Pacer
	Logger                         logger.Logger
	Trailer                        []byte
	RTCPWriter                     func([]rtcp.Packet) error
	DisableSenderReportPassThrough bool
	SupportsCodecChange            bool
	Listener                       DownTrackListener
}

type DownTrackState added in v1.2.4

type DownTrackState struct {
	RTPStats                      *rtpstats.RTPStatsSender
	DeltaStatsSenderSnapshotId    uint32
	RTPStatsRTX                   *rtpstats.RTPStatsSender
	DeltaStatsRTXSenderSnapshotId uint32
	ForwarderState                *livekit.RTPForwarderState
	PlayoutDelayControllerState   PlayoutDelayControllerState
}

func (DownTrackState) MarshalLogObject added in v1.8.0

func (d DownTrackState) MarshalLogObject(e zapcore.ObjectEncoder) error

type DownTrackStreamAllocatorListener added in v1.4.0

type DownTrackStreamAllocatorListener interface {
	// RTCP received
	OnREMB(dt *DownTrack, remb *rtcp.ReceiverEstimatedMaximumBitrate)
	OnTransportCCFeedback(dt *DownTrack, cc *rtcp.TransportLayerCC)

	// video layer availability changed
	OnAvailableLayersChanged(dt *DownTrack)

	// video layer bitrate availability changed
	OnBitrateAvailabilityChanged(dt *DownTrack)

	// max published spatial layer changed
	OnMaxPublishedSpatialChanged(dt *DownTrack)

	// max published temporal layer changed
	OnMaxPublishedTemporalChanged(dt *DownTrack)

	// subscription changed - mute/unmute
	OnSubscriptionChanged(dt *DownTrack)

	// subscribed max video layer changed
	OnSubscribedLayerChanged(dt *DownTrack, layers buffer.VideoLayer)

	// stream resumed
	OnResume(dt *DownTrack)

	// check if track should participate in BWE
	IsBWEEnabled(dt *DownTrack) bool

	// get the BWE type in use
	BWEType() bwe.BWEType

	// check if subscription mute can be applied
	IsSubscribeMutable(dt *DownTrack) bool
}

type ForwardStats added in v1.6.2

type ForwardStats struct {
	// contains filtered or unexported fields
}

func NewForwardStats added in v1.6.2

func NewForwardStats(latencyUpdateInterval, reportInterval, latencyWindowLength time.Duration) *ForwardStats

func (*ForwardStats) GetShortStats added in v1.9.4

func (s *ForwardStats) GetShortStats(shortDuration time.Duration) (time.Duration, time.Duration)

func (*ForwardStats) GetStats added in v1.6.2

func (s *ForwardStats) GetStats(shortDuration time.Duration) (time.Duration, time.Duration)

func (*ForwardStats) Stop added in v1.6.2

func (s *ForwardStats) Stop()

func (*ForwardStats) Update added in v1.6.2

func (s *ForwardStats) Update(arrival, left int64) (int64, bool)

type Forwarder added in v0.15.0

type Forwarder struct {
	// contains filtered or unexported fields
}

func NewForwarder added in v0.15.0

func NewForwarder(
	kind webrtc.RTPCodecType,
	logger logger.Logger,
	skipReferenceTS bool,
	disableOpportunisticAllocation bool,
	rtpStats *rtpstats.RTPStatsSender,
) *Forwarder

func (*Forwarder) AllocateNextHigher added in v0.15.0

func (f *Forwarder) AllocateNextHigher(availableChannelCapacity int64, availableLayers []int32, brs Bitrates, allowOvershoot bool) (VideoAllocation, bool)

func (*Forwarder) AllocateOptimal added in v0.15.6

func (f *Forwarder) AllocateOptimal(availableLayers []int32, brs Bitrates, allowOvershoot bool, hold bool) VideoAllocation

func (*Forwarder) BandwidthRequested added in v0.15.0

func (f *Forwarder) BandwidthRequested(brs Bitrates) int64

func (*Forwarder) CheckSync added in v0.15.6

func (f *Forwarder) CheckSync() (bool, int32)

func (*Forwarder) CurrentLayer added in v1.4.2

func (f *Forwarder) CurrentLayer() buffer.VideoLayer

func (*Forwarder) DetermineCodec added in v1.1.0

func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions []webrtc.RTPHeaderExtensionParameter, videoLayerMode livekit.VideoLayer_Mode)

func (*Forwarder) DistanceToDesired added in v0.15.0

func (f *Forwarder) DistanceToDesired(availableLayers []int32, brs Bitrates) float64

func (*Forwarder) FilterRTX added in v0.15.5

func (f *Forwarder) FilterRTX(nacks []uint16) (filtered []uint16, disallowedLayers [buffer.DefaultMaxLayerSpatial + 1]bool)

func (*Forwarder) GetMaxSubscribedSpatial added in v1.4.5

func (f *Forwarder) GetMaxSubscribedSpatial() int32

func (*Forwarder) GetNextHigherTransition added in v0.15.5

func (f *Forwarder) GetNextHigherTransition(brs Bitrates, allowOvershoot bool) (VideoTransition, bool)

func (*Forwarder) GetOptimalBandwidthNeeded added in v1.4.0

func (f *Forwarder) GetOptimalBandwidthNeeded(brs Bitrates) int64

func (*Forwarder) GetPadding added in v1.4.2

func (f *Forwarder) GetPadding(frameEndNeeded bool) ([]byte, error)

func (*Forwarder) GetSenderReportParams added in v1.6.0

func (f *Forwarder) GetSenderReportParams() (int32, bool, uint64, *livekit.RTCPSenderReportState)

func (*Forwarder) GetSnTsForBlankFrames added in v0.15.0

func (f *Forwarder) GetSnTsForBlankFrames(frameRate uint32, numPackets int) ([]SnTs, bool, error)

func (*Forwarder) GetSnTsForPadding added in v0.15.0

func (f *Forwarder) GetSnTsForPadding(num int, frameRate uint32, forceMarker bool) ([]SnTs, error)

func (*Forwarder) GetState added in v1.1.1

func (f *Forwarder) GetState() *livekit.RTPForwarderState

func (*Forwarder) GetTranslationParams added in v0.15.0

func (f *Forwarder) GetTranslationParams(extPkt *buffer.ExtPacket, layer int32) (TranslationParams, error)

func (*Forwarder) IsAnyMuted added in v1.3.5

func (f *Forwarder) IsAnyMuted() bool

func (*Forwarder) IsDeficient added in v0.15.0

func (f *Forwarder) IsDeficient() bool

func (*Forwarder) IsMuted added in v0.15.4

func (f *Forwarder) IsMuted() bool

func (*Forwarder) IsPubMuted added in v1.3.4

func (f *Forwarder) IsPubMuted() bool

func (*Forwarder) MaxLayer added in v1.4.2

func (f *Forwarder) MaxLayer() buffer.VideoLayer

func (*Forwarder) Mute added in v0.15.0

func (f *Forwarder) Mute(muted bool, isSubscribeMutable bool) bool

func (*Forwarder) Pause added in v0.15.0

func (f *Forwarder) Pause(availableLayers []int32, brs Bitrates) VideoAllocation

func (*Forwarder) PauseReason added in v1.4.5

func (f *Forwarder) PauseReason() VideoPauseReason

func (*Forwarder) ProvisionalAllocate added in v0.15.0

func (f *Forwarder) ProvisionalAllocate(availableChannelCapacity int64, layer buffer.VideoLayer, allowPause bool, allowOvershoot bool) (bool, int64)

func (*Forwarder) ProvisionalAllocateCommit added in v0.15.0

func (f *Forwarder) ProvisionalAllocateCommit() VideoAllocation

func (*Forwarder) ProvisionalAllocateGetBestWeightedTransition added in v0.15.0

func (f *Forwarder) ProvisionalAllocateGetBestWeightedTransition() (VideoTransition, []int32, Bitrates)

func (*Forwarder) ProvisionalAllocateGetCooperativeTransition added in v0.15.0

func (f *Forwarder) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) (VideoTransition, []int32, Bitrates)

func (*Forwarder) ProvisionalAllocatePrepare added in v0.15.0

func (f *Forwarder) ProvisionalAllocatePrepare(availableLayers []int32, bitrates Bitrates)

func (*Forwarder) ProvisionalAllocateReset added in v1.4.5

func (f *Forwarder) ProvisionalAllocateReset()

func (*Forwarder) PubMute added in v1.3.4

func (f *Forwarder) PubMute(pubMuted bool) bool

func (*Forwarder) RTPMungerDebugInfo added in v1.5.0

func (f *Forwarder) RTPMungerDebugInfo() map[string]any

func (*Forwarder) Restart added in v1.8.4

func (f *Forwarder) Restart()

func (*Forwarder) Resync added in v0.15.4

func (f *Forwarder) Resync()

func (*Forwarder) SeedState added in v1.1.1

func (f *Forwarder) SeedState(state *livekit.RTPForwarderState)

func (*Forwarder) SetMaxPublishedLayer added in v1.3.5

func (f *Forwarder) SetMaxPublishedLayer(maxPublishedLayer int32) bool

func (*Forwarder) SetMaxSpatialLayer added in v0.15.0

func (f *Forwarder) SetMaxSpatialLayer(spatialLayer int32) (bool, buffer.VideoLayer)

func (*Forwarder) SetMaxTemporalLayer added in v0.15.0

func (f *Forwarder) SetMaxTemporalLayer(temporalLayer int32) (bool, buffer.VideoLayer)

func (*Forwarder) SetMaxTemporalLayerSeen added in v1.4.0

func (f *Forwarder) SetMaxTemporalLayerSeen(maxTemporalLayerSeen int32) bool

func (*Forwarder) SetRefSenderReport added in v1.6.0

func (f *Forwarder) SetRefSenderReport(layer int32, srData *livekit.RTCPSenderReportState)

func (*Forwarder) TargetLayer added in v1.4.2

func (f *Forwarder) TargetLayer() buffer.VideoLayer

type PLIThrottleConfig added in v1.8.1

type PLIThrottleConfig struct {
	LowQuality  time.Duration `yaml:"low_quality,omitempty"`
	MidQuality  time.Duration `yaml:"mid_quality,omitempty"`
	HighQuality time.Duration `yaml:"high_quality,omitempty"`
}

type PlayoutDelayController added in v1.5.3

type PlayoutDelayController struct {
	// contains filtered or unexported fields
}

func NewPlayoutDelayController added in v1.5.3

func NewPlayoutDelayController(minDelay, maxDelay uint32, logger logger.Logger, rtpStats *rtpstats.RTPStatsSender) (*PlayoutDelayController, error)

func (*PlayoutDelayController) GetDelayExtension added in v1.5.3

func (c *PlayoutDelayController) GetDelayExtension(seq uint16) []byte

func (*PlayoutDelayController) GetState added in v1.8.1

func (*PlayoutDelayController) OnSeqAcked added in v1.5.3

func (c *PlayoutDelayController) OnSeqAcked(seq uint16)

func (*PlayoutDelayController) SeedState added in v1.8.1

func (*PlayoutDelayController) SetJitter added in v1.5.3

func (c *PlayoutDelayController) SetJitter(jitter uint32)

type PlayoutDelayControllerState added in v1.8.1

type PlayoutDelayControllerState struct {
	SenderSnapshotID uint32
}

func (PlayoutDelayControllerState) MarshalLogObject added in v1.8.1

type PlayoutDelayState added in v1.5.3

type PlayoutDelayState int32
const (
	PlayoutDelayStateChanged PlayoutDelayState = iota
	PlayoutDelaySending
	PlayoutDelayAcked
)

func (PlayoutDelayState) String added in v1.5.3

func (s PlayoutDelayState) String() string

type REDTransformer added in v1.9.0

type REDTransformer interface {
	ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32
	ForwardRTCPSenderReport(
		payloadType webrtc.PayloadType,
		layer int32,
		publisherSRData *livekit.RTCPSenderReportState,
	)
	GetDownTracks() []TrackSender
	HasDownTracks() bool
	ResyncDownTracks()
	OnStreamRestart()
	CanClose() bool
	Close()
}

type RTPMunger added in v0.15.0

type RTPMunger struct {
	// contains filtered or unexported fields
}

func NewRTPMunger added in v0.15.0

func NewRTPMunger(logger logger.Logger) *RTPMunger

func (*RTPMunger) DebugInfo added in v1.5.0

func (r *RTPMunger) DebugInfo() map[string]any

func (*RTPMunger) FilterRTX added in v0.15.5

func (r *RTPMunger) FilterRTX(nacks []uint16) []uint16

func (*RTPMunger) GetState added in v1.7.1

func (r *RTPMunger) GetState() *livekit.RTPMungerState

func (*RTPMunger) GetTSOffset added in v1.6.2

func (r *RTPMunger) GetTSOffset() uint64

func (*RTPMunger) IsOnFrameBoundary added in v0.15.0

func (r *RTPMunger) IsOnFrameBoundary() bool

func (*RTPMunger) PacketDropped added in v0.15.0

func (r *RTPMunger) PacketDropped(extPkt *buffer.ExtPacket)

func (*RTPMunger) SeedState added in v1.7.1

func (r *RTPMunger) SeedState(state *livekit.RTPMungerState)

func (*RTPMunger) SetLastSnTs added in v0.15.0

func (r *RTPMunger) SetLastSnTs(extPkt *buffer.ExtPacket)

func (*RTPMunger) UpdateAndGetPaddingSnTs added in v0.15.0

func (r *RTPMunger) UpdateAndGetPaddingSnTs(
	num int,
	clockRate uint32,
	frameRate uint32,
	forceMarker bool,
	extRtpTimestamp uint64,
) ([]SnTs, error)

func (*RTPMunger) UpdateAndGetSnTs added in v0.15.0

func (r *RTPMunger) UpdateAndGetSnTs(extPkt *buffer.ExtPacket, marker bool) (TranslationParamsRTP, error)

func (*RTPMunger) UpdateSnTsOffsets added in v0.15.0

func (r *RTPMunger) UpdateSnTsOffsets(extPkt *buffer.ExtPacket, snAdjust uint64, tsAdjust uint64)

type ReceiverBase added in v1.9.10

type ReceiverBase struct {
	// contains filtered or unexported fields
}

func NewReceiverBase added in v1.9.10

func NewReceiverBase(params ReceiverBaseParams, trackInfo *livekit.TrackInfo, codecState ReceiverCodecState) *ReceiverBase

func (*ReceiverBase) AddBuffer added in v1.9.10

func (r *ReceiverBase) AddBuffer(buff buffer.BufferProvider, layer int32)

func (*ReceiverBase) AddDownTrack added in v1.9.10

func (r *ReceiverBase) AddDownTrack(track TrackSender) error

func (*ReceiverBase) AddOnCodecStateChange added in v1.9.10

func (r *ReceiverBase) AddOnCodecStateChange(f func(webrtc.RTPCodecParameters, ReceiverCodecState))

func (*ReceiverBase) AddOnReady added in v1.9.10

func (r *ReceiverBase) AddOnReady(fn func())

func (*ReceiverBase) CanClose added in v1.9.10

func (r *ReceiverBase) CanClose() bool

func (*ReceiverBase) ClearAllBuffers added in v1.9.10

func (r *ReceiverBase) ClearAllBuffers(reason string)

func (*ReceiverBase) Close added in v1.9.10

func (r *ReceiverBase) Close(reason string, clearBuffers bool)

func (*ReceiverBase) Codec added in v1.9.10

func (*ReceiverBase) CodecState added in v1.9.10

func (r *ReceiverBase) CodecState() ReceiverCodecState

func (*ReceiverBase) DebugInfo added in v1.9.10

func (r *ReceiverBase) DebugInfo() map[string]any

func (*ReceiverBase) DeleteDownTrack added in v1.9.10

func (r *ReceiverBase) DeleteDownTrack(subscriberID livekit.ParticipantID)

func (*ReceiverBase) GetAllBuffers added in v1.9.10

func (*ReceiverBase) GetAudioLevel added in v1.9.10

func (r *ReceiverBase) GetAudioLevel() (float64, bool)

func (*ReceiverBase) GetDownTracks added in v1.9.10

func (r *ReceiverBase) GetDownTracks() []TrackSender

func (*ReceiverBase) GetLayeredBitrate added in v1.9.10

func (r *ReceiverBase) GetLayeredBitrate() ([]int32, Bitrates)

func (*ReceiverBase) GetOrCreateBuffer added in v1.9.10

func (r *ReceiverBase) GetOrCreateBuffer(
	layer int32,
	creatorFn func(*livekit.TrackInfo) (buffer.BufferProvider, error),
) (buffer.BufferProvider, bool)

func (*ReceiverBase) GetPrimaryReceiverForRed added in v1.9.10

func (r *ReceiverBase) GetPrimaryReceiverForRed() TrackReceiver

func (*ReceiverBase) GetRedReceiver added in v1.9.10

func (r *ReceiverBase) GetRedReceiver() TrackReceiver

func (*ReceiverBase) GetTemporalLayerFpsForSpatial added in v1.9.10

func (r *ReceiverBase) GetTemporalLayerFpsForSpatial(layer int32) []float32

func (*ReceiverBase) GetTrackStats added in v1.9.10

func (r *ReceiverBase) GetTrackStats() *livekit.RTPStats

func (*ReceiverBase) HeaderExtensions added in v1.9.10

func (r *ReceiverBase) HeaderExtensions() []webrtc.RTPHeaderExtensionParameter

func (*ReceiverBase) IsClosed added in v1.9.10

func (r *ReceiverBase) IsClosed() bool

func (*ReceiverBase) Kind added in v1.9.10

func (r *ReceiverBase) Kind() webrtc.RTPCodecType

func (*ReceiverBase) Logger added in v1.9.10

func (r *ReceiverBase) Logger() logger.Logger

func (*ReceiverBase) Mime added in v1.9.10

func (r *ReceiverBase) Mime() mime.MimeType

func (*ReceiverBase) OnAvailableLayersChanged added in v1.9.10

func (r *ReceiverBase) OnAvailableLayersChanged()

StreamTrackerManagerListener.OnAvailableLayersChanged

func (*ReceiverBase) OnBitrateAvailabilityChanged added in v1.9.10

func (r *ReceiverBase) OnBitrateAvailabilityChanged()

StreamTrackerManagerListener.OnBitrateAvailabilityChanged

func (*ReceiverBase) OnBitrateReport added in v1.9.10

func (r *ReceiverBase) OnBitrateReport(availableLayers []int32, bitrates Bitrates)

StreamTrackerManagerListener.OnBitrateReport

func (*ReceiverBase) OnMaxAvailableLayerChanged added in v1.9.10

func (r *ReceiverBase) OnMaxAvailableLayerChanged(maxAvailableLayer int32)

StreamTrackerManagerListener.OnMaxAvailableLayerChanged

func (*ReceiverBase) OnMaxLayerChange added in v1.9.10

func (r *ReceiverBase) OnMaxLayerChange(fn func(mimeType mime.MimeType, maxLayer int32))

func (*ReceiverBase) OnMaxPublishedLayerChanged added in v1.9.10

func (r *ReceiverBase) OnMaxPublishedLayerChanged(maxPublishedLayer int32)

StreamTrackerManagerListener.OnMaxPublishedLayerChanged

func (*ReceiverBase) OnMaxTemporalLayerSeenChanged added in v1.9.10

func (r *ReceiverBase) OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)

StreamTrackerManagerListener.OnMaxTemporalLayerSeenChanged

func (*ReceiverBase) OnVideoSizeChanged added in v1.9.10

func (r *ReceiverBase) OnVideoSizeChanged(f func())

func (*ReceiverBase) ReadRTP added in v1.9.10

func (r *ReceiverBase) ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)

func (*ReceiverBase) Restart added in v1.9.10

func (r *ReceiverBase) Restart(reason string)

func (*ReceiverBase) SendPLI added in v1.9.10

func (r *ReceiverBase) SendPLI(layer int32, force bool)

func (*ReceiverBase) SetAudioConfig added in v1.9.10

func (r *ReceiverBase) SetAudioConfig(audioConfig AudioConfig)

func (*ReceiverBase) SetCodecState added in v1.9.10

func (r *ReceiverBase) SetCodecState(state ReceiverCodecState)

func (*ReceiverBase) SetCodecWithState added in v1.9.10

func (r *ReceiverBase) SetCodecWithState(codec webrtc.RTPCodecParameters, headerExtensions []webrtc.RTPHeaderExtensionParameter, codecState ReceiverCodecState)

func (*ReceiverBase) SetEnableRTPStreamRestartDetection added in v1.9.10

func (r *ReceiverBase) SetEnableRTPStreamRestartDetection(enableRTPStremRestartDetection bool)

func (*ReceiverBase) SetForwardStats added in v1.9.10

func (r *ReceiverBase) SetForwardStats(forwardStats *ForwardStats)

func (*ReceiverBase) SetLBThreshold added in v1.9.10

func (r *ReceiverBase) SetLBThreshold(lbThreshold int)

func (*ReceiverBase) SetMaxExpectedSpatialLayer added in v1.9.10

func (r *ReceiverBase) SetMaxExpectedSpatialLayer(layer int32)

func (*ReceiverBase) SetPLIThrottleConfig added in v1.9.10

func (r *ReceiverBase) SetPLIThrottleConfig(pliThrottleConfig PLIThrottleConfig)

func (*ReceiverBase) SetRTT added in v1.9.10

func (r *ReceiverBase) SetRTT(rtt uint32)

func (*ReceiverBase) SetUpTrackPaused added in v1.9.10

func (r *ReceiverBase) SetUpTrackPaused(paused bool)

SetUpTrackPaused indicates upstream will not be sending any data. this will reflect the "muted" status and will pause streamtracker to ensure we don't turn off the layer

func (*ReceiverBase) StartBuffer added in v1.9.10

func (r *ReceiverBase) StartBuffer(buff buffer.BufferProvider, layer int32)

func (*ReceiverBase) StreamID added in v1.9.10

func (r *ReceiverBase) StreamID() string

func (*ReceiverBase) StreamTrackerManager added in v1.9.10

func (r *ReceiverBase) StreamTrackerManager() *StreamTrackerManager

func (*ReceiverBase) TrackID added in v1.9.10

func (r *ReceiverBase) TrackID() livekit.TrackID

func (*ReceiverBase) TrackInfo added in v1.9.10

func (r *ReceiverBase) TrackInfo() *livekit.TrackInfo

func (*ReceiverBase) UpdateTrackInfo added in v1.9.10

func (r *ReceiverBase) UpdateTrackInfo(ti *livekit.TrackInfo)

func (*ReceiverBase) VideoLayerMode added in v1.9.10

func (r *ReceiverBase) VideoLayerMode() livekit.VideoLayer_Mode

func (*ReceiverBase) VideoSizes added in v1.9.10

func (r *ReceiverBase) VideoSizes() []buffer.VideoSize

type ReceiverBaseParams added in v1.9.10

type ReceiverBaseParams struct {
	TrackID                           livekit.TrackID
	StreamID                          string
	Kind                              webrtc.RTPCodecType
	Codec                             webrtc.RTPCodecParameters
	HeaderExtensions                  []webrtc.RTPHeaderExtensionParameter
	Logger                            logger.Logger
	StreamTrackerManagerConfig        StreamTrackerManagerConfig
	StreamTrackerManagerListener      StreamTrackerManagerListener
	IsSelfClosing                     bool
	IsForwardPacketArrivalTimeEnabled bool
	OnClosed                          func()
}

type ReceiverCodecState added in v1.8.4

type ReceiverCodecState int
const (
	ReceiverCodecStateNormal ReceiverCodecState = iota
	ReceiverCodecStateSuspended
	ReceiverCodecStateInvalid
)

type ReceiverOpts

type ReceiverOpts func(w *WebRTCReceiver) *WebRTCReceiver

func WithAudioConfig added in v0.15.7

func WithAudioConfig(audioConfig AudioConfig) ReceiverOpts

WithAudioConfig sets up parameters for active speaker detection

func WithEnableRTPStreamRestartDetection added in v1.9.9

func WithEnableRTPStreamRestartDetection(enable bool) ReceiverOpts

func WithForwardStats added in v1.6.2

func WithForwardStats(forwardStats *ForwardStats) ReceiverOpts

func WithLoadBalanceThreshold

func WithLoadBalanceThreshold(downTracks int) ReceiverOpts

WithLoadBalanceThreshold enables parallelization of packet writes when downTracks exceeds threshold Value should be between 3 and 150. For a server handling a few large rooms, use a smaller value (required to handle very large (250+ participant) rooms). For a server handling many small rooms, use a larger value or disable. Set to 0 (disabled) by default.

func WithPliThrottleConfig added in v0.15.7

func WithPliThrottleConfig(pliThrottleConfig PLIThrottleConfig) ReceiverOpts

WithPliThrottleConfig indicates minimum time(ms) between sending PLIs

type ReceiverReportListener

type ReceiverReportListener func(dt *DownTrack, report *rtcp.ReceiverReport)

type RedPrimaryReceiver added in v1.2.0

type RedPrimaryReceiver struct {
	TrackReceiver
	// contains filtered or unexported fields
}

func NewRedPrimaryReceiver added in v1.2.0

func NewRedPrimaryReceiver(receiver TrackReceiver, dsp utils.DownTrackSpreaderParams) *RedPrimaryReceiver

func (*RedPrimaryReceiver) AddDownTrack added in v1.2.0

func (r *RedPrimaryReceiver) AddDownTrack(track TrackSender) error

func (*RedPrimaryReceiver) CanClose added in v1.2.0

func (r *RedPrimaryReceiver) CanClose() bool

func (*RedPrimaryReceiver) Close added in v1.2.0

func (r *RedPrimaryReceiver) Close()

func (*RedPrimaryReceiver) DeleteDownTrack added in v1.2.0

func (r *RedPrimaryReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)

func (*RedPrimaryReceiver) ForwardRTCPSenderReport added in v1.9.0

func (r *RedPrimaryReceiver) ForwardRTCPSenderReport(
	payloadType webrtc.PayloadType,
	layer int32,
	publisherSRData *livekit.RTCPSenderReportState,
)

func (*RedPrimaryReceiver) ForwardRTP added in v1.2.0

func (r *RedPrimaryReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32

func (*RedPrimaryReceiver) GetDownTracks added in v1.8.4

func (r *RedPrimaryReceiver) GetDownTracks() []TrackSender

func (*RedPrimaryReceiver) IsClosed added in v1.3.5

func (r *RedPrimaryReceiver) IsClosed() bool

func (*RedPrimaryReceiver) OnStreamRestart added in v1.9.9

func (r *RedPrimaryReceiver) OnStreamRestart()

func (*RedPrimaryReceiver) ReadRTP added in v1.2.0

func (r *RedPrimaryReceiver) ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)

func (*RedPrimaryReceiver) ResyncDownTracks added in v1.8.1

func (r *RedPrimaryReceiver) ResyncDownTracks()

type RedReceiver added in v1.3.0

type RedReceiver struct {
	TrackReceiver
	// contains filtered or unexported fields
}

func NewRedReceiver added in v1.3.0

func NewRedReceiver(receiver TrackReceiver, dsp utils.DownTrackSpreaderParams) *RedReceiver

func (*RedReceiver) AddDownTrack added in v1.3.0

func (r *RedReceiver) AddDownTrack(track TrackSender) error

func (*RedReceiver) CanClose added in v1.3.0

func (r *RedReceiver) CanClose() bool

func (*RedReceiver) Close added in v1.3.0

func (r *RedReceiver) Close()

func (*RedReceiver) DeleteDownTrack added in v1.3.0

func (r *RedReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)

func (*RedReceiver) ForwardRTCPSenderReport added in v1.9.0

func (r *RedReceiver) ForwardRTCPSenderReport(
	payloadType webrtc.PayloadType,
	layer int32,
	publisherSRData *livekit.RTCPSenderReportState,
)

func (*RedReceiver) ForwardRTP added in v1.3.0

func (r *RedReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32

func (*RedReceiver) GetDownTracks added in v1.8.4

func (r *RedReceiver) GetDownTracks() []TrackSender

func (*RedReceiver) IsClosed added in v1.3.5

func (r *RedReceiver) IsClosed() bool

func (*RedReceiver) OnStreamRestart added in v1.9.9

func (r *RedReceiver) OnStreamRestart()

func (*RedReceiver) ReadRTP added in v1.3.0

func (r *RedReceiver) ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)

func (*RedReceiver) ResyncDownTracks added in v1.8.1

func (r *RedReceiver) ResyncDownTracks()

type SequenceNumberOrdering

type SequenceNumberOrdering int

RTPMunger

const (
	SequenceNumberOrderingContiguous SequenceNumberOrdering = iota
	SequenceNumberOrderingOutOfOrder
	SequenceNumberOrderingGap
	SequenceNumberOrderingDuplicate
)

type SnTs added in v0.15.0

type SnTs struct {
	// contains filtered or unexported fields
}

type StreamTrackerConfig added in v1.8.1

type StreamTrackerConfig struct {
	StreamTrackerType     StreamTrackerType                                 `yaml:"stream_tracker_type,omitempty"`
	BitrateReportInterval map[int32]time.Duration                           `yaml:"bitrate_report_interval,omitempty"`
	PacketTracker         map[int32]streamtracker.StreamTrackerPacketConfig `yaml:"packet_tracker,omitempty"`
	FrameTracker          map[int32]streamtracker.StreamTrackerFrameConfig  `yaml:"frame_tracker,omitempty"`
}

type StreamTrackerFrameConfig added in v1.8.1

type StreamTrackerFrameConfig struct {
	MinFPS float64 `yaml:"min_fps,omitempty"`
}

type StreamTrackerManager added in v0.15.4

type StreamTrackerManager struct {
	// contains filtered or unexported fields
}

func NewStreamTrackerManager added in v0.15.4

func NewStreamTrackerManager(
	logger logger.Logger,
	trackInfo *livekit.TrackInfo,
	mimeType mime.MimeType,
	clockRate uint32,
	config StreamTrackerManagerConfig,
) *StreamTrackerManager

func (*StreamTrackerManager) AddDependencyDescriptorTrackers added in v1.4.4

func (s *StreamTrackerManager) AddDependencyDescriptorTrackers()

func (*StreamTrackerManager) AddTracker added in v0.15.4

func (*StreamTrackerManager) Close added in v1.4.0

func (s *StreamTrackerManager) Close()

func (*StreamTrackerManager) DistanceToDesired added in v1.2.0

func (s *StreamTrackerManager) DistanceToDesired() float64

func (*StreamTrackerManager) GetLayeredBitrate added in v1.2.4

func (s *StreamTrackerManager) GetLayeredBitrate() ([]int32, Bitrates)

func (*StreamTrackerManager) GetMaxPublishedLayer added in v1.3.5

func (s *StreamTrackerManager) GetMaxPublishedLayer() int32

func (*StreamTrackerManager) GetMaxTemporalLayerSeen added in v1.4.0

func (s *StreamTrackerManager) GetMaxTemporalLayerSeen() int32

func (*StreamTrackerManager) GetTracker added in v0.15.4

func (*StreamTrackerManager) IsPaused added in v1.3.3

func (s *StreamTrackerManager) IsPaused() bool

func (*StreamTrackerManager) RemoveAllTrackers added in v0.15.4

func (s *StreamTrackerManager) RemoveAllTrackers()

func (*StreamTrackerManager) RemoveTracker added in v0.15.4

func (s *StreamTrackerManager) RemoveTracker(layer int32)

func (*StreamTrackerManager) SetListener added in v1.4.0

func (s *StreamTrackerManager) SetListener(listener StreamTrackerManagerListener)

func (*StreamTrackerManager) SetMaxExpectedSpatialLayer added in v0.15.4

func (s *StreamTrackerManager) SetMaxExpectedSpatialLayer(layer int32) int32

func (*StreamTrackerManager) SetPaused added in v0.15.4

func (s *StreamTrackerManager) SetPaused(paused bool)

func (*StreamTrackerManager) UpdateTrackInfo added in v1.5.2

func (s *StreamTrackerManager) UpdateTrackInfo(ti *livekit.TrackInfo)

type StreamTrackerManagerConfig added in v1.8.1

type StreamTrackerManagerConfig struct {
	Video       StreamTrackerConfig `yaml:"video,omitempty"`
	Screenshare StreamTrackerConfig `yaml:"screenshare,omitempty"`
}

type StreamTrackerManagerListener added in v1.4.0

type StreamTrackerManagerListener interface {
	OnAvailableLayersChanged()
	OnBitrateAvailabilityChanged()
	OnMaxPublishedLayerChanged(maxPublishedLayer int32)
	OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)
	OnMaxAvailableLayerChanged(maxAvailableLayer int32)
	OnBitrateReport(availableLayers []int32, bitrates Bitrates)
}

type StreamTrackerPacketConfig added in v1.8.1

type StreamTrackerPacketConfig struct {
	SamplesRequired uint32        `yaml:"samples_required,omitempty"` // number of samples needed per cycle
	CyclesRequired  uint32        `yaml:"cycles_required,omitempty"`  // number of cycles needed to be active
	CycleDuration   time.Duration `yaml:"cycle_duration,omitempty"`
}

type StreamTrackerType added in v1.8.1

type StreamTrackerType string
const (
	StreamTrackerTypePacket StreamTrackerType = "packet"
	StreamTrackerTypeFrame  StreamTrackerType = "frame"
)

type TrackReceiver added in v0.15.0

type TrackReceiver interface {
	TrackID() livekit.TrackID
	StreamID() string

	// returns the initial codec of the receiver, it is determined by the track's codec
	// and will not change if the codec changes during the session (publisher changes codec)
	Codec() webrtc.RTPCodecParameters
	Mime() mime.MimeType
	VideoLayerMode() livekit.VideoLayer_Mode
	HeaderExtensions() []webrtc.RTPHeaderExtensionParameter
	IsClosed() bool

	ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)
	GetLayeredBitrate() ([]int32, Bitrates)

	GetAudioLevel() (float64, bool)

	SendPLI(layer int32, force bool)

	SetUpTrackPaused(paused bool)
	SetMaxExpectedSpatialLayer(layer int32)

	AddDownTrack(track TrackSender) error
	DeleteDownTrack(participantID livekit.ParticipantID)
	GetDownTracks() []TrackSender

	DebugInfo() map[string]any

	TrackInfo() *livekit.TrackInfo
	UpdateTrackInfo(ti *livekit.TrackInfo)

	// Get primary receiver if this receiver represents a RED codec; otherwise it will return itself
	GetPrimaryReceiverForRed() TrackReceiver

	// Get red receiver for primary codec, used by forward red encodings for opus only codec
	GetRedReceiver() TrackReceiver

	GetTemporalLayerFpsForSpatial(layer int32) []float32

	GetTrackStats() *livekit.RTPStats

	// AddOnReady adds a function to be called when the receiver is ready, the callback
	// could be called immediately if the receiver is ready when the callback is added
	AddOnReady(func())

	AddOnCodecStateChange(func(webrtc.RTPCodecParameters, ReceiverCodecState))
	CodecState() ReceiverCodecState

	// VideoSizes returns the video size parsed from rtp packet for each spatial layer.
	VideoSizes() []buffer.VideoSize

	// closes all associated buffers and issues a resync to all attached downtracks so that
	// they can resync and have proper sequncing without gaps in sequence numbers / timestamps
	Restart(reason string)
}

TrackReceiver defines an interface receive media from remote peer

type TrackRemote added in v1.8.1

type TrackRemote interface {
	ID() string
	RID() string
	Msid() string
	SSRC() webrtc.SSRC
	RtxSSRC() webrtc.SSRC
	StreamID() string
	Kind() webrtc.RTPCodecType
	Codec() webrtc.RTPCodecParameters
	RTCTrack() *webrtc.TrackRemote
}

type TrackRemoteFromSdp added in v1.8.1

type TrackRemoteFromSdp struct {
	*webrtc.TrackRemote
	// contains filtered or unexported fields
}

TrackRemoteFromSdp represents a remote track that could be created by the sdp. It is a wrapper around the webrtc.TrackRemote and return the Codec from sdp before the first RTP packet is received.

func NewTrackRemoteFromSdp added in v1.8.1

func NewTrackRemoteFromSdp(track *webrtc.TrackRemote, codec webrtc.RTPCodecParameters) *TrackRemoteFromSdp

func (*TrackRemoteFromSdp) Codec added in v1.8.1

func (*TrackRemoteFromSdp) RTCTrack added in v1.8.4

func (t *TrackRemoteFromSdp) RTCTrack() *webrtc.TrackRemote

type TrackSender added in v0.15.0

type TrackSender interface {
	UpTrackLayersChange()
	UpTrackBitrateAvailabilityChange()
	UpTrackMaxPublishedLayerChange(maxPublishedLayer int32)
	UpTrackMaxTemporalLayerSeenChange(maxTemporalLayerSeen int32)
	UpTrackBitrateReport(availableLayers []int32, bitrates Bitrates)
	WriteRTP(p *buffer.ExtPacket, layer int32) int32
	Close()
	IsClosed() bool
	// ID is the globally unique identifier for this Track.
	ID() string
	SubscriberID() livekit.ParticipantID
	HandleRTCPSenderReportData(
		payloadType webrtc.PayloadType,
		layer int32,
		publisherSRData *livekit.RTCPSenderReportState,
	) error
	Resync()
	SetReceiver(TrackReceiver)
	ReceiverRestart()
	EnableForwardPacketArrivalTime(enable bool)
}

TrackSender defines an interface send media to remote peer

type TranslationParams added in v0.15.0

type TranslationParams struct {
	// contains filtered or unexported fields
}

type TranslationParamsRTP added in v0.15.0

type TranslationParamsRTP struct {
	// contains filtered or unexported fields
}

type VideoAllocation added in v0.15.0

type VideoAllocation struct {
	PauseReason         VideoPauseReason
	IsDeficient         bool
	BandwidthRequested  int64
	BandwidthDelta      int64
	BandwidthNeeded     int64
	Bitrates            Bitrates
	TargetLayer         buffer.VideoLayer
	RequestLayerSpatial int32
	MaxLayer            buffer.VideoLayer
	DistanceToDesired   float64
}

func (*VideoAllocation) MarshalLogObject added in v1.6.0

func (v *VideoAllocation) MarshalLogObject(e zapcore.ObjectEncoder) error

func (*VideoAllocation) String added in v0.15.0

func (v *VideoAllocation) String() string

type VideoAllocationProvisional added in v0.15.0

type VideoAllocationProvisional struct {
	// contains filtered or unexported fields
}

type VideoPauseReason added in v1.3.4

type VideoPauseReason int
const (
	VideoPauseReasonNone VideoPauseReason = iota
	VideoPauseReasonMuted
	VideoPauseReasonPubMuted
	VideoPauseReasonFeedDry
	VideoPauseReasonBandwidth
)

func (VideoPauseReason) String added in v1.3.4

func (v VideoPauseReason) String() string

type VideoTransition added in v0.15.0

type VideoTransition struct {
	From           buffer.VideoLayer
	To             buffer.VideoLayer
	BandwidthDelta int64
}

func (*VideoTransition) MarshalLogObject added in v1.6.0

func (v *VideoTransition) MarshalLogObject(e zapcore.ObjectEncoder) error

func (*VideoTransition) String added in v1.2.4

func (v *VideoTransition) String() string

type WebRTCReceiver

type WebRTCReceiver struct {
	*ReceiverBase
	// contains filtered or unexported fields
}

WebRTCReceiver receives a media track

func NewWebRTCReceiver

func NewWebRTCReceiver(
	receiver *webrtc.RTPReceiver,
	track TrackRemote,
	trackInfo *livekit.TrackInfo,
	logger logger.Logger,
	onRTCP func([]rtcp.Packet),
	streamTrackerManagerConfig StreamTrackerManagerConfig,
	opts ...ReceiverOpts,
) *WebRTCReceiver

NewWebRTCReceiver creates a new webrtc track receiver

func (*WebRTCReceiver) AddUpTrack

func (w *WebRTCReceiver) AddUpTrack(track TrackRemote, buff *buffer.Buffer) error

func (*WebRTCReceiver) DebugInfo

func (w *WebRTCReceiver) DebugInfo() map[string]any

func (*WebRTCReceiver) GetConnectionScoreAndQuality added in v1.4.0

func (w *WebRTCReceiver) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality)

func (*WebRTCReceiver) GetDeltaStats added in v1.5.0

func (w *WebRTCReceiver) GetDeltaStats() map[uint32]*buffer.StreamStatsWithLayers

func (*WebRTCReceiver) GetLastSenderReportTime added in v1.6.1

func (w *WebRTCReceiver) GetLastSenderReportTime() time.Time

func (*WebRTCReceiver) OnAvailableLayersChanged added in v1.4.0

func (w *WebRTCReceiver) OnAvailableLayersChanged()

StreamTrackerManagerListener.OnAvailableLayersChanged

func (*WebRTCReceiver) OnBitrateAvailabilityChanged added in v1.4.0

func (w *WebRTCReceiver) OnBitrateAvailabilityChanged()

StreamTrackerManagerListener.OnBitrateAvailabilityChanged

func (*WebRTCReceiver) OnBitrateReport added in v1.4.0

func (w *WebRTCReceiver) OnBitrateReport(availableLayers []int32, bitrates Bitrates)

StreamTrackerManagerListener.OnBitrateReport

func (*WebRTCReceiver) OnCloseHandler

func (w *WebRTCReceiver) OnCloseHandler(fn func())

OnCloseHandler method to be called on remote track removed

func (*WebRTCReceiver) OnMaxAvailableLayerChanged added in v1.4.0

func (w *WebRTCReceiver) OnMaxAvailableLayerChanged(maxAvailableLayer int32)

StreamTrackerManagerListener.OnMaxAvailableLayerChanged

func (*WebRTCReceiver) OnMaxPublishedLayerChanged added in v1.4.0

func (w *WebRTCReceiver) OnMaxPublishedLayerChanged(maxPublishedLayer int32)

StreamTrackerManagerListener.OnMaxPublishedLayerChanged

func (*WebRTCReceiver) OnMaxTemporalLayerSeenChanged added in v1.4.0

func (w *WebRTCReceiver) OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)

StreamTrackerManagerListener.OnMaxTemporalLayerSeenChanged

func (*WebRTCReceiver) OnStatsUpdate added in v0.15.4

func (w *WebRTCReceiver) OnStatsUpdate(fn func(w *WebRTCReceiver, stat *livekit.AnalyticsStat))

func (*WebRTCReceiver) SetMaxExpectedSpatialLayer added in v0.15.2

func (w *WebRTCReceiver) SetMaxExpectedSpatialLayer(layer int32)

func (*WebRTCReceiver) SetUpTrackPaused

func (w *WebRTCReceiver) SetUpTrackPaused(paused bool)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL