sfu

package
v1.4.3 Latest Latest
Warning

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

Go to latest
Published: Jun 4, 2023 License: Apache-2.0 Imports: 31 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           = true
	TransitionCostSpatial   = 10
	ParkedLayerWaitDuration = 2 * time.Second
)

Forwarder

View Source
const (
	RtxGateWindow = 2000

	SnOffsetCacheSize = 4096
	SnOffsetCacheMask = SnOffsetCacheSize - 1
)
View Source
const (
	MimeTypeAudioRed = "audio/red"
)

Variables

View Source
var (
	ErrUnknownKind                       = errors.New("unknown kind of codec")
	ErrOutOfOrderSequenceNumberCacheMiss = errors.New("out-of-order sequence number not found in cache")
	ErrPaddingOnlyPacket                 = errors.New("padding only packet that need not be forwarded")
	ErrDuplicatePacket                   = errors.New("duplicate packet")
	ErrPaddingNotOnFrameBoundary         = errors.New("padding cannot send on non-frame boundary")
	ErrDownTrackAlreadyBound             = errors.New("already bound")
)
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")
	ErrBufferNotFound        = errors.New("buffer not found")
)
View Source
var (
	ErrIncompleteRedHeader = errors.New("incomplete red block header")
	ErrIncompleteRedBlock  = errors.New("incomplete red block payload")
)
View Source
var (
	PacketFactory *sync.Pool
)
View Source
var (
	VideoAllocationDefault = VideoAllocation{
		PauseReason:         VideoPauseReasonFeedDry,
		TargetLayer:         buffer.InvalidLayer,
		RequestLayerSpatial: buffer.InvalidLayerSpatial,
		MaxLayer:            buffer.InvalidLayer,
	}
)

Functions

func IsRedCodec added in v1.2.0

func IsRedCodec(mime string) bool

func IsSvcCodec added in v1.1.0

func IsSvcCodec(mime string) bool

Types

type AudioLevelHandle added in v0.15.3

type AudioLevelHandle func(level uint8, duration uint32)

type Bitrates added in v0.15.0

type DownTrack

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

DownTrack implements 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(
	codecs []webrtc.RTPCodecParameters,
	r TrackReceiver,
	bf *buffer.Factory,
	subID livekit.ParticipantID,
	mt int,
	allowTimestampAdjustment bool,
	logger logger.Logger,
) (*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) VideoAllocation

func (*DownTrack) BandwidthRequested added in v0.15.0

func (d *DownTrack) BandwidthRequested() int64

func (*DownTrack) Bind

func (d *DownTrack) Bind(t webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error)

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) ClearStreamAllocatorReportInterval added in v1.4.0

func (d *DownTrack) ClearStreamAllocatorReportInterval()

func (*DownTrack) Close

func (d *DownTrack) Close()

func (*DownTrack) CloseWithFlush added in v0.15.3

func (d *DownTrack) CloseWithFlush(flush 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]interface{}

func (*DownTrack) DistanceToDesired added in v0.15.0

func (d *DownTrack) DistanceToDesired() float64

func (*DownTrack) GetAndResetBytesSent added in v1.4.2

func (d *DownTrack) GetAndResetBytesSent() (uint32, uint32)

func (*DownTrack) GetConnectionScoreAndQuality added in v1.4.0

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

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) 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, _srData *buffer.RTCPSenderReportData) 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) 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) OnCloseHandler

func (d *DownTrack) OnCloseHandler(fn func(willBeResumed bool))

OnCloseHandler method to be called on remote tracked removed

func (*DownTrack) OnMaxLayerChanged added in v0.15.4

func (d *DownTrack) OnMaxLayerChanged(fn func(dt *DownTrack, layer int32))

func (*DownTrack) OnRttUpdate added in v0.15.4

func (d *DownTrack) OnRttUpdate(fn func(dt *DownTrack, rtt uint32))

func (*DownTrack) OnStatsUpdate added in v0.15.3

func (d *DownTrack) OnStatsUpdate(fn func(dt *DownTrack, stat *livekit.AnalyticsStat))

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) 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) 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) Resync added in v0.15.4

func (d *DownTrack) Resync()

func (*DownTrack) SSRC

func (d *DownTrack) SSRC() 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) SetRTPHeaderExtensions

func (d *DownTrack) SetRTPHeaderExtensions(rtpHeaderExtensions []webrtc.RTPHeaderExtensionParameter)

Sets RTP header extensions for this track

func (*DownTrack) SetStreamAllocatorListener added in v1.4.0

func (d *DownTrack) SetStreamAllocatorListener(listener DownTrackStreamAllocatorListener)

func (*DownTrack) SetStreamAllocatorReportInterval added in v1.4.0

func (d *DownTrack) SetStreamAllocatorReportInterval(interval time.Duration)

func (*DownTrack) SetTransceiver

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

func (*DownTrack) Stop

func (d *DownTrack) Stop() error

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) TrackInfoAvailable added in v1.2.0

func (d *DownTrack) TrackInfoAvailable()

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) WriteRTP

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

WriteRTP writes an RTP Packet to the DownTrack

type DownTrackSpreader added in v0.15.7

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

func NewDownTrackSpreader added in v0.15.7

func NewDownTrackSpreader(params DownTrackSpreaderParams) *DownTrackSpreader

func (*DownTrackSpreader) Broadcast added in v0.15.7

func (d *DownTrackSpreader) Broadcast(writer func(TrackSender))

func (*DownTrackSpreader) DownTrackCount added in v1.1.0

func (d *DownTrackSpreader) DownTrackCount() int

func (*DownTrackSpreader) Free added in v0.15.7

func (d *DownTrackSpreader) Free(subscriberID livekit.ParticipantID)

func (*DownTrackSpreader) GetDownTracks added in v0.15.7

func (d *DownTrackSpreader) GetDownTracks() []TrackSender

func (*DownTrackSpreader) HasDownTrack added in v0.15.7

func (d *DownTrackSpreader) HasDownTrack(subscriberID livekit.ParticipantID) bool

func (*DownTrackSpreader) ResetAndGetDownTracks added in v0.15.7

func (d *DownTrackSpreader) ResetAndGetDownTracks() []TrackSender

func (*DownTrackSpreader) Store added in v0.15.7

func (d *DownTrackSpreader) Store(ts TrackSender)

type DownTrackSpreaderParams added in v0.15.7

type DownTrackSpreaderParams struct {
	Threshold int
	Logger    logger.Logger
}

type DownTrackState added in v1.2.4

type DownTrackState struct {
	RTPStats                       *buffer.RTPStats
	DeltaStatsSnapshotId           uint32
	DeltaStatsOverriddenSnapshotId uint32
	ForwarderState                 ForwarderState
}

func (DownTrackState) String added in v1.2.4

func (d DownTrackState) String() string

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)

	// packet(s) sent
	OnPacketsSent(dt *DownTrack, size int)

	// NACKs received
	OnNACK(dt *DownTrack, nackInfos []NackInfo)

	// RTCP Receiver Report received
	OnRTCPReceiverReport(dt *DownTrack, rr rtcp.ReceptionReport)
}

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,
	getReferenceLayerRTPTimestamp func(ts uint32, layer int32, referenceLayer int32) (uint32, error),
	getExpectedRTPTimestamp func(at time.Time) (uint32, uint64, error),
) *Forwarder

func (*Forwarder) AdjustTimestamp added in v1.4.2

func (f *Forwarder) AdjustTimestamp(tsAdjust float64)

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) 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() (locked bool, layer 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)

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) 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) GetRTPMungerParams added in v0.15.0

func (f *Forwarder) GetRTPMungerParams() RTPMungerParams

func (*Forwarder) GetReferenceLayerSpatial added in v1.3.3

func (f *Forwarder) GetReferenceLayerSpatial() int32

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, forceMarker bool) ([]SnTs, error)

func (*Forwarder) GetState added in v1.1.1

func (f *Forwarder) GetState() ForwarderState

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) (bool, buffer.VideoLayer)

func (*Forwarder) OnParkedLayerExpired added in v1.4.2

func (f *Forwarder) OnParkedLayerExpired(fn func())

func (*Forwarder) Pause added in v0.15.0

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

func (*Forwarder) ProvisionalAllocate added in v0.15.0

func (f *Forwarder) ProvisionalAllocate(availableChannelCapacity int64, layer buffer.VideoLayer, allowPause bool, allowOvershoot 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

func (*Forwarder) ProvisionalAllocateGetCooperativeTransition added in v0.15.0

func (f *Forwarder) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) VideoTransition

func (*Forwarder) ProvisionalAllocatePrepare added in v0.15.0

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

func (*Forwarder) PubMute added in v1.3.4

func (f *Forwarder) PubMute(pubMuted bool) (bool, buffer.VideoLayer)

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 ForwarderState)

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, buffer.VideoLayer)

func (*Forwarder) SetMaxTemporalLayer added in v0.15.0

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

func (*Forwarder) SetMaxTemporalLayerSeen added in v1.4.0

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

func (*Forwarder) TargetLayer added in v1.4.2

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

type ForwarderState added in v1.1.1

type ForwarderState struct {
	Started      bool
	PreStartTime time.Time
	FirstTS      uint32
	RefTSOffset  uint32
	RTP          RTPMungerState
	Codec        interface{}
}

func (ForwarderState) String added in v1.2.4

func (f ForwarderState) String() string

type NackInfo added in v1.4.2

type NackInfo struct {
	Timestamp      uint32
	SequenceNumber uint16
	Attempts       uint8
}

type RTPMunger added in v0.15.0

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

func NewRTPMunger added in v0.15.0

func NewRTPMunger(logger logger.Logger) *RTPMunger

func (*RTPMunger) FilterRTX added in v0.15.5

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

func (*RTPMunger) GetLast added in v1.1.1

func (r *RTPMunger) GetLast() RTPMungerState

func (*RTPMunger) GetParams added in v0.15.0

func (r *RTPMunger) GetParams() RTPMungerParams

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) SeedLast added in v1.1.1

func (r *RTPMunger) SeedLast(state 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, rtpTimestamp uint32) ([]SnTs, error)

func (*RTPMunger) UpdateAndGetSnTs added in v0.15.0

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

func (*RTPMunger) UpdateSnTsOffsets added in v0.15.0

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

func (*RTPMunger) UpdateTsOffset added in v1.4.2

func (r *RTPMunger) UpdateTsOffset(tsAdjust uint32)

type RTPMungerParams added in v0.15.0

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

type RTPMungerState added in v1.1.1

type RTPMungerState struct {
	LastSN uint16
	LastTS uint32
}

func (RTPMungerState) String added in v1.2.4

func (r RTPMungerState) String() string

type ReceiverOpts

type ReceiverOpts func(w *WebRTCReceiver) *WebRTCReceiver

func WithAudioConfig added in v0.15.7

func WithAudioConfig(audioConfig config.AudioConfig) ReceiverOpts

WithAudioConfig sets up parameters for active speaker detection

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 config.PLIThrottleConfig) ReceiverOpts

WithPliThrottleConfig indicates minimum time(ms) between sending PLIs

func WithStreamTrackers

func WithStreamTrackers() ReceiverOpts

WithStreamTrackers enables StreamTracker use for simulcast

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 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) ForwardRTP added in v1.2.0

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

func (*RedPrimaryReceiver) IsClosed added in v1.3.5

func (r *RedPrimaryReceiver) IsClosed() bool

func (*RedPrimaryReceiver) ReadRTP added in v1.2.0

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

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 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) ForwardRTP added in v1.3.0

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

func (*RedReceiver) IsClosed added in v1.3.5

func (r *RedReceiver) IsClosed() bool

func (*RedReceiver) ReadRTP added in v1.3.0

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

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 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,
	isSVC bool,
	clockRate uint32,
	trackersConfig config.StreamTrackersConfig,
) *StreamTrackerManager

func (*StreamTrackerManager) AddTracker added in v0.15.4

func (s *StreamTrackerManager) AddTracker(layer int32) *streamtracker.StreamTracker

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) GetRTCPSenderReportData added in v1.4.3

func (s *StreamTrackerManager) GetRTCPSenderReportData(layer int32) (*buffer.RTCPSenderReportData, *buffer.RTCPSenderReportData)

func (*StreamTrackerManager) GetReferenceLayerRTPTimestamp added in v1.4.0

func (s *StreamTrackerManager) GetReferenceLayerRTPTimestamp(ts uint32, layer int32, referenceLayer int32) (uint32, error)

func (*StreamTrackerManager) GetTracker added in v0.15.4

func (s *StreamTrackerManager) GetTracker(layer int32) *streamtracker.StreamTracker

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) SetRTCPSenderReportData added in v1.4.2

func (s *StreamTrackerManager) SetRTCPSenderReportData(layer int32, srFirst *buffer.RTCPSenderReportData, srNewest *buffer.RTCPSenderReportData)

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 TrackReceiver added in v0.15.0

type TrackReceiver interface {
	TrackID() livekit.TrackID
	StreamID() string
	Codec() webrtc.RTPCodecParameters
	HeaderExtensions() []webrtc.RTPHeaderExtensionParameter
	IsClosed() bool

	ReadRTP(buf []byte, layer uint8, sn uint16) (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)

	DebugInfo() map[string]interface{}

	TrackInfo() *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

	GetRTCPSenderReportData(layer int32) (*buffer.RTCPSenderReportData, *buffer.RTCPSenderReportData)
	GetReferenceLayerRTPTimestamp(ts uint32, layer int32, referenceLayer int32) (uint32, error)
}

TrackReceiver defines an interface receive media from remote peer

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) error
	Close()
	IsClosed() bool
	// ID is the globally unique identifier for this Track.
	ID() string
	SubscriberID() livekit.ParticipantID
	TrackInfoAvailable()
	HandleRTCPSenderReportData(payloadType webrtc.PayloadType, layer int32, srData *buffer.RTCPSenderReportData) error
}

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) String added in v0.15.0

func (v VideoAllocation) String() string

type VideoAllocationProvisional added in v0.15.0

type VideoAllocationProvisional struct {
	Bitrates Bitrates
	// 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) String added in v1.2.4

func (v VideoTransition) String() string

type WebRTCReceiver

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

WebRTCReceiver receives a media track

func NewWebRTCReceiver

func NewWebRTCReceiver(
	receiver *webrtc.RTPReceiver,
	track *webrtc.TrackRemote,
	trackInfo *livekit.TrackInfo,
	logger logger.Logger,
	twcc *twcc.Responder,
	trackersConfig config.StreamTrackersConfig,
	opts ...ReceiverOpts,
) *WebRTCReceiver

NewWebRTCReceiver creates a new webrtc track receiver

func (*WebRTCReceiver) AddDownTrack

func (w *WebRTCReceiver) AddDownTrack(track TrackSender) error

func (*WebRTCReceiver) AddUpTrack

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

func (*WebRTCReceiver) Codec

func (w *WebRTCReceiver) Codec() webrtc.RTPCodecParameters

func (*WebRTCReceiver) DebugInfo

func (w *WebRTCReceiver) DebugInfo() map[string]interface{}

func (*WebRTCReceiver) DeleteDownTrack

func (w *WebRTCReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)

DeleteDownTrack removes a DownTrack from a Receiver

func (*WebRTCReceiver) GetAudioLevel added in v0.15.7

func (w *WebRTCReceiver) GetAudioLevel() (float64, bool)

func (*WebRTCReceiver) GetConnectionScoreAndQuality added in v1.4.0

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

func (*WebRTCReceiver) GetLayeredBitrate added in v1.2.4

func (w *WebRTCReceiver) GetLayeredBitrate() ([]int32, Bitrates)

func (*WebRTCReceiver) GetPrimaryReceiverForRed added in v1.2.0

func (w *WebRTCReceiver) GetPrimaryReceiverForRed() TrackReceiver

func (*WebRTCReceiver) GetRTCPSenderReportData added in v1.3.3

func (w *WebRTCReceiver) GetRTCPSenderReportData(layer int32) (*buffer.RTCPSenderReportData, *buffer.RTCPSenderReportData)

func (*WebRTCReceiver) GetRedReceiver added in v1.3.0

func (w *WebRTCReceiver) GetRedReceiver() TrackReceiver

func (*WebRTCReceiver) GetReferenceLayerRTPTimestamp added in v1.3.3

func (w *WebRTCReceiver) GetReferenceLayerRTPTimestamp(ts uint32, layer int32, referenceLayer int32) (uint32, error)

func (*WebRTCReceiver) GetTemporalLayerFpsForSpatial added in v1.3.0

func (w *WebRTCReceiver) GetTemporalLayerFpsForSpatial(layer int32) []float32

func (*WebRTCReceiver) GetTrackStats added in v0.15.6

func (w *WebRTCReceiver) GetTrackStats() *livekit.RTPStats

func (*WebRTCReceiver) HeaderExtensions added in v1.1.0

func (w *WebRTCReceiver) HeaderExtensions() []webrtc.RTPHeaderExtensionParameter

func (*WebRTCReceiver) IsClosed added in v1.3.5

func (w *WebRTCReceiver) IsClosed() bool

func (*WebRTCReceiver) Kind

func (w *WebRTCReceiver) Kind() webrtc.RTPCodecType

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 tracked removed

func (*WebRTCReceiver) OnMaxAvailableLayerChanged added in v1.4.0

func (w *WebRTCReceiver) OnMaxAvailableLayerChanged(maxAvailableLayer int32)

StreamTrackerManagerListener.OnMaxAvailableLayerChanged

func (*WebRTCReceiver) OnMaxLayerChange added in v1.1.0

func (w *WebRTCReceiver) OnMaxLayerChange(fn func(maxLayer int32))

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) ReadRTP added in v0.15.0

func (w *WebRTCReceiver) ReadRTP(buf []byte, layer uint8, sn uint16) (int, error)

func (*WebRTCReceiver) SSRC

func (w *WebRTCReceiver) SSRC(layer int) uint32

func (*WebRTCReceiver) SendPLI added in v0.15.0

func (w *WebRTCReceiver) SendPLI(layer int32, force bool)

func (*WebRTCReceiver) SetMaxExpectedSpatialLayer added in v0.15.2

func (w *WebRTCReceiver) SetMaxExpectedSpatialLayer(layer int32)

func (*WebRTCReceiver) SetRTCPCh

func (w *WebRTCReceiver) SetRTCPCh(ch chan []rtcp.Packet)

func (*WebRTCReceiver) SetRTT added in v0.15.4

func (w *WebRTCReceiver) SetRTT(rtt uint32)

func (*WebRTCReceiver) SetUpTrackPaused

func (w *WebRTCReceiver) 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 (*WebRTCReceiver) StreamID

func (w *WebRTCReceiver) StreamID() string

func (*WebRTCReceiver) TrackID

func (w *WebRTCReceiver) TrackID() livekit.TrackID

func (*WebRTCReceiver) TrackInfo added in v1.2.0

func (w *WebRTCReceiver) TrackInfo() *livekit.TrackInfo

Directories

Path Synopsis
Design of Prober
Design of Prober

Jump to

Keyboard shortcuts

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