Documentation
¶
Index ¶
- Constants
- Variables
- type AudioConfig
- type Bitrates
- type DownTrack
- func (d *DownTrack) AddReceiverReportListener(listener ReceiverReportListener)
- func (d *DownTrack) AllocateNextHigher(availableChannelCapacity int64, allowOvershoot bool) (VideoAllocation, bool)
- func (d *DownTrack) AllocateOptimal(allowOvershoot bool, hold bool) VideoAllocation
- func (d *DownTrack) BandwidthRequested() int64
- func (d *DownTrack) Bind(t webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error)
- func (d *DownTrack) Close()
- func (d *DownTrack) CloseWithFlush(flush bool, isEnding bool)
- func (d *DownTrack) Codec() webrtc.RTPCodecCapability
- func (d *DownTrack) CreateSenderReport() *rtcp.SenderReport
- func (d *DownTrack) CreateSourceDescriptionChunks() []rtcp.SourceDescriptionChunk
- func (d *DownTrack) DebugInfo() map[string]any
- func (d *DownTrack) DistanceToDesired() float64
- func (d *DownTrack) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality)
- func (d *DownTrack) GetDeltaStatsSender() map[uint32]*buffer.StreamStatsWithLayers
- func (d *DownTrack) GetNackStats() (totalPackets uint32, totalRepeatedNACKs uint32)
- func (d *DownTrack) GetNextHigherTransition(allowOvershoot bool) (VideoTransition, bool)
- func (d *DownTrack) GetPrimaryStreamLastReceiverReportTime() time.Time
- func (d *DownTrack) GetPrimaryStreamPacketsSent() uint64
- func (d *DownTrack) GetState() DownTrackState
- func (d *DownTrack) GetTrackStats() *livekit.RTPStats
- func (d *DownTrack) GetTransceiver() *webrtc.RTPTransceiver
- func (d *DownTrack) HandleRTCPSenderReportData(_payloadType webrtc.PayloadType, layer int32, ...) error
- func (d *DownTrack) ID() string
- func (d *DownTrack) IsClosed() bool
- func (d *DownTrack) IsDeficient() bool
- func (d *DownTrack) Kind() webrtc.RTPCodecType
- func (d *DownTrack) MaxLayer() buffer.VideoLayer
- func (d *DownTrack) Mime() mime.MimeType
- func (d *DownTrack) Mute(muted bool)
- func (d *DownTrack) OnBinding(fn func(error))
- func (d *DownTrack) OnStatsUpdate(fn func(d *DownTrack, stat *livekit.AnalyticsStat))
- func (d *DownTrack) Pause() VideoAllocation
- func (d *DownTrack) ProvisionalAllocate(availableChannelCapacity int64, layers buffer.VideoLayer, allowPause bool, ...) (bool, int64)
- func (d *DownTrack) ProvisionalAllocateCommit() VideoAllocation
- func (d *DownTrack) ProvisionalAllocateGetBestWeightedTransition() VideoTransition
- func (d *DownTrack) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) VideoTransition
- func (d *DownTrack) ProvisionalAllocatePrepare()
- func (d *DownTrack) ProvisionalAllocateReset()
- func (d *DownTrack) PubMute(pubMuted bool)
- func (d *DownTrack) RID() string
- func (d *DownTrack) Receiver() TrackReceiver
- func (d *DownTrack) ReceiverRestart(rcvr TrackReceiver)
- func (d *DownTrack) Resync()
- func (d *DownTrack) SSRC() uint32
- func (d *DownTrack) SSRCRTX() uint32
- func (d *DownTrack) SeedState(state DownTrackState)
- func (d *DownTrack) SetActivePaddingOnMuteUpTrack()
- func (d *DownTrack) SetConnected()
- func (d *DownTrack) SetMaxSpatialLayer(spatialLayer int32)
- func (d *DownTrack) SetMaxTemporalLayer(temporalLayer int32)
- func (d *DownTrack) SetProbeClusterId(probeClusterId ccutils.ProbeClusterId)
- func (d *DownTrack) SetReceiver(r TrackReceiver)
- func (d *DownTrack) SetStreamAllocatorListener(listener DownTrackStreamAllocatorListener)
- func (d *DownTrack) SetTransceiver(transceiver *webrtc.RTPTransceiver)
- func (d *DownTrack) StopWriteAndGetState() DownTrackState
- func (d *DownTrack) StreamID() string
- func (d *DownTrack) SubscriberID() livekit.ParticipantID
- func (d *DownTrack) SwapProbeClusterId(match ccutils.ProbeClusterId, swap ccutils.ProbeClusterId)
- func (d *DownTrack) Unbind(_ webrtc.TrackLocalContext) error
- func (d *DownTrack) UpTrackBitrateAvailabilityChange()
- func (d *DownTrack) UpTrackBitrateReport(availableLayers []int32, bitrates Bitrates)
- func (d *DownTrack) UpTrackLayersChange()
- func (d *DownTrack) UpTrackMaxPublishedLayerChange(maxPublishedLayer int32)
- func (d *DownTrack) UpTrackMaxTemporalLayerSeenChange(maxTemporalLayerSeen int32)
- func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool, forceMarker bool) int
- func (d *DownTrack) WriteProbePackets(bytesToSend int, usePadding bool) int
- func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) int32
- type DownTrackListener
- type DownTrackParams
- type DownTrackState
- type DownTrackStreamAllocatorListener
- type ForwardStats
- type Forwarder
- func (f *Forwarder) AllocateNextHigher(availableChannelCapacity int64, availableLayers []int32, brs Bitrates, ...) (VideoAllocation, bool)
- func (f *Forwarder) AllocateOptimal(availableLayers []int32, brs Bitrates, allowOvershoot bool, hold bool) VideoAllocation
- func (f *Forwarder) BandwidthRequested(brs Bitrates) int64
- func (f *Forwarder) CheckSync() (bool, int32)
- func (f *Forwarder) CurrentLayer() buffer.VideoLayer
- func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, ...)
- func (f *Forwarder) DistanceToDesired(availableLayers []int32, brs Bitrates) float64
- func (f *Forwarder) FilterRTX(nacks []uint16) (filtered []uint16, disallowedLayers [buffer.DefaultMaxLayerSpatial + 1]bool)
- func (f *Forwarder) GetMaxSubscribedSpatial() int32
- func (f *Forwarder) GetNextHigherTransition(brs Bitrates, allowOvershoot bool) (VideoTransition, bool)
- func (f *Forwarder) GetOptimalBandwidthNeeded(brs Bitrates) int64
- func (f *Forwarder) GetPadding(frameEndNeeded bool) ([]byte, error)
- func (f *Forwarder) GetSenderReportParams() (int32, bool, uint64, *livekit.RTCPSenderReportState)
- func (f *Forwarder) GetSnTsForBlankFrames(frameRate uint32, numPackets int) ([]SnTs, bool, error)
- func (f *Forwarder) GetSnTsForPadding(num int, frameRate uint32, forceMarker bool) ([]SnTs, error)
- func (f *Forwarder) GetState() *livekit.RTPForwarderState
- func (f *Forwarder) GetTranslationParams(extPkt *buffer.ExtPacket, layer int32) (TranslationParams, error)
- func (f *Forwarder) IsAnyMuted() bool
- func (f *Forwarder) IsDeficient() bool
- func (f *Forwarder) IsMuted() bool
- func (f *Forwarder) IsPubMuted() bool
- func (f *Forwarder) MaxLayer() buffer.VideoLayer
- func (f *Forwarder) Mute(muted bool, isSubscribeMutable bool) bool
- func (f *Forwarder) Pause(availableLayers []int32, brs Bitrates) VideoAllocation
- func (f *Forwarder) PauseReason() VideoPauseReason
- func (f *Forwarder) ProvisionalAllocate(availableChannelCapacity int64, layer buffer.VideoLayer, allowPause bool, ...) (bool, int64)
- func (f *Forwarder) ProvisionalAllocateCommit() VideoAllocation
- func (f *Forwarder) ProvisionalAllocateGetBestWeightedTransition() (VideoTransition, []int32, Bitrates)
- func (f *Forwarder) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) (VideoTransition, []int32, Bitrates)
- func (f *Forwarder) ProvisionalAllocatePrepare(availableLayers []int32, bitrates Bitrates)
- func (f *Forwarder) ProvisionalAllocateReset()
- func (f *Forwarder) PubMute(pubMuted bool) bool
- func (f *Forwarder) RTPMungerDebugInfo() map[string]any
- func (f *Forwarder) Restart()
- func (f *Forwarder) Resync()
- func (f *Forwarder) SeedState(state *livekit.RTPForwarderState)
- func (f *Forwarder) SetMaxPublishedLayer(maxPublishedLayer int32) bool
- func (f *Forwarder) SetMaxSpatialLayer(spatialLayer int32) (bool, buffer.VideoLayer)
- func (f *Forwarder) SetMaxTemporalLayer(temporalLayer int32) (bool, buffer.VideoLayer)
- func (f *Forwarder) SetMaxTemporalLayerSeen(maxTemporalLayerSeen int32) bool
- func (f *Forwarder) SetRefSenderReport(layer int32, srData *livekit.RTCPSenderReportState)
- func (f *Forwarder) TargetLayer() buffer.VideoLayer
- type PLIThrottleConfig
- type PlayoutDelayController
- func (c *PlayoutDelayController) GetDelayExtension(seq uint16) []byte
- func (c *PlayoutDelayController) GetState() PlayoutDelayControllerState
- func (c *PlayoutDelayController) OnSeqAcked(seq uint16)
- func (c *PlayoutDelayController) SeedState(pdcs PlayoutDelayControllerState)
- func (c *PlayoutDelayController) SetJitter(jitter uint32)
- type PlayoutDelayControllerState
- type PlayoutDelayState
- type REDTransformer
- type RTPMunger
- func (r *RTPMunger) DebugInfo() map[string]any
- func (r *RTPMunger) FilterRTX(nacks []uint16) []uint16
- func (r *RTPMunger) GetExtLastTimestamp() uint64
- func (r *RTPMunger) GetState() *livekit.RTPMungerState
- func (r *RTPMunger) GetTSOffset() uint64
- func (r *RTPMunger) IsOnFrameBoundary() bool
- func (r *RTPMunger) PacketDropped(extPkt *buffer.ExtPacket)
- func (r *RTPMunger) SeedState(state *livekit.RTPMungerState)
- func (r *RTPMunger) SetLastSnTs(extPkt *buffer.ExtPacket)
- func (r *RTPMunger) UpdateAndGetPaddingSnTs(num int, clockRate uint32, frameRate uint32, forceMarker bool, ...) ([]SnTs, error)
- func (r *RTPMunger) UpdateAndGetSnTs(extPkt *buffer.ExtPacket, marker bool) (TranslationParamsRTP, error)
- func (r *RTPMunger) UpdateSnTsOffsets(extPkt *buffer.ExtPacket, snAdjust uint64, tsAdjust uint64)
- type ReceiverBase
- func (r *ReceiverBase) AddBuffer(buff buffer.BufferProvider, layer int32)
- func (r *ReceiverBase) AddDownTrack(track TrackSender) error
- func (r *ReceiverBase) AddOnCodecStateChange(f func(webrtc.RTPCodecParameters, ReceiverCodecState))
- func (r *ReceiverBase) AddOnReady(fn func())
- func (r *ReceiverBase) CanClose() bool
- func (r *ReceiverBase) ClearAllBuffers(reason string)
- func (r *ReceiverBase) Close(reason string, clearBuffers bool)
- func (r *ReceiverBase) Codec() webrtc.RTPCodecParameters
- func (r *ReceiverBase) CodecState() ReceiverCodecState
- func (r *ReceiverBase) DebugInfo() map[string]any
- func (r *ReceiverBase) DeleteDownTrack(subscriberID livekit.ParticipantID)
- func (r *ReceiverBase) GetAllBuffers() [buffer.DefaultMaxLayerSpatial + 1]buffer.BufferProvider
- func (r *ReceiverBase) GetAudioLevel() (float64, bool)
- func (r *ReceiverBase) GetDownTracks() []TrackSender
- func (r *ReceiverBase) GetLayeredBitrate() ([]int32, Bitrates)
- func (r *ReceiverBase) GetOrCreateBuffer(layer int32) buffer.BufferProvider
- func (r *ReceiverBase) GetPrimaryReceiverForRed() TrackReceiver
- func (r *ReceiverBase) GetRedReceiver() TrackReceiver
- func (r *ReceiverBase) GetTemporalLayerFpsForSpatial(layer int32) []float32
- func (r *ReceiverBase) GetTrackStats() *livekit.RTPStats
- func (r *ReceiverBase) HeaderExtensions() []webrtc.RTPHeaderExtensionParameter
- func (r *ReceiverBase) IsClosed() bool
- func (r *ReceiverBase) Kind() webrtc.RTPCodecType
- func (r *ReceiverBase) Logger() logger.Logger
- func (r *ReceiverBase) Mime() mime.MimeType
- func (r *ReceiverBase) OnAvailableLayersChanged()
- func (r *ReceiverBase) OnBitrateAvailabilityChanged()
- func (r *ReceiverBase) OnBitrateReport(availableLayers []int32, bitrates Bitrates)
- func (r *ReceiverBase) OnMaxAvailableLayerChanged(maxAvailableLayer int32)
- func (r *ReceiverBase) OnMaxLayerChange(fn func(mimeType mime.MimeType, maxLayer int32))
- func (r *ReceiverBase) OnMaxPublishedLayerChanged(maxPublishedLayer int32)
- func (r *ReceiverBase) OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)
- func (r *ReceiverBase) OnVideoSizeChanged(f func())
- func (r *ReceiverBase) ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)
- func (r *ReceiverBase) Restart(reason string)
- func (r *ReceiverBase) SendPLI(layer int32, force bool)
- func (r *ReceiverBase) SetAudioConfig(audioConfig AudioConfig)
- func (r *ReceiverBase) SetCodecState(state ReceiverCodecState)
- func (r *ReceiverBase) SetCodecWithState(codec webrtc.RTPCodecParameters, ...)
- func (r *ReceiverBase) SetEnableRTPStreamRestartDetection(enableRTPStremRestartDetection bool)
- func (r *ReceiverBase) SetForwardStats(forwardStats *ForwardStats)
- func (r *ReceiverBase) SetLBThreshold(lbThreshold int)
- func (r *ReceiverBase) SetMaxExpectedSpatialLayer(layer int32)
- func (r *ReceiverBase) SetPLIThrottleConfig(pliThrottleConfig PLIThrottleConfig)
- func (r *ReceiverBase) SetRTT(rtt uint32)
- func (r *ReceiverBase) StartBuffer(buff buffer.BufferProvider, layer int32)
- func (r *ReceiverBase) StreamID() string
- func (r *ReceiverBase) StreamTrackerManager() *StreamTrackerManager
- func (r *ReceiverBase) TrackID() livekit.TrackID
- func (r *ReceiverBase) TrackInfo() *livekit.TrackInfo
- func (r *ReceiverBase) UpdateTrackInfo(ti *livekit.TrackInfo)
- func (r *ReceiverBase) VideoLayerMode() livekit.VideoLayer_Mode
- func (r *ReceiverBase) VideoSizes() []codec.VideoSize
- type ReceiverBaseParams
- type ReceiverCodecState
- type ReceiverOpts
- func WithAudioConfig(audioConfig AudioConfig) ReceiverOpts
- func WithEnableRTPStreamRestartDetection(enable bool) ReceiverOpts
- func WithForwardStats(forwardStats *ForwardStats) ReceiverOpts
- func WithLoadBalanceThreshold(downTracks int) ReceiverOpts
- func WithPliThrottleConfig(pliThrottleConfig PLIThrottleConfig) ReceiverOpts
- type ReceiverReportListener
- type RedPrimaryReceiver
- func (r *RedPrimaryReceiver) AddDownTrack(track TrackSender) error
- func (r *RedPrimaryReceiver) CanClose() bool
- func (r *RedPrimaryReceiver) Close()
- func (r *RedPrimaryReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)
- func (r *RedPrimaryReceiver) ForwardRTCPSenderReport(payloadType webrtc.PayloadType, layer int32, ...)
- func (r *RedPrimaryReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32
- func (r *RedPrimaryReceiver) GetDownTracks() []TrackSender
- func (r *RedPrimaryReceiver) IsClosed() bool
- func (r *RedPrimaryReceiver) OnStreamRestart()
- func (r *RedPrimaryReceiver) ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)
- func (r *RedPrimaryReceiver) ResyncDownTracks()
- type RedReceiver
- func (r *RedReceiver) AddDownTrack(track TrackSender) error
- func (r *RedReceiver) CanClose() bool
- func (r *RedReceiver) Close()
- func (r *RedReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)
- func (r *RedReceiver) ForwardRTCPSenderReport(payloadType webrtc.PayloadType, layer int32, ...)
- func (r *RedReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32
- func (r *RedReceiver) GetDownTracks() []TrackSender
- func (r *RedReceiver) IsClosed() bool
- func (r *RedReceiver) OnStreamRestart()
- func (r *RedReceiver) ReadRTP(buf []byte, layer uint8, esn uint64) (int, error)
- func (r *RedReceiver) ResyncDownTracks()
- type SequenceNumberOrdering
- type SnTs
- type StreamTrackerConfig
- type StreamTrackerFrameConfig
- type StreamTrackerManager
- func (s *StreamTrackerManager) AddDependencyDescriptorTrackers()
- func (s *StreamTrackerManager) AddTracker(layer int32) streamtracker.StreamTrackerWorker
- func (s *StreamTrackerManager) Close()
- func (s *StreamTrackerManager) DistanceToDesired() float64
- func (s *StreamTrackerManager) GetLayeredBitrate() ([]int32, Bitrates)
- func (s *StreamTrackerManager) GetMaxPublishedLayer() int32
- func (s *StreamTrackerManager) GetMaxTemporalLayerSeen() int32
- func (s *StreamTrackerManager) GetTracker(layer int32) streamtracker.StreamTrackerWorker
- func (s *StreamTrackerManager) RemoveAllTrackers()
- func (s *StreamTrackerManager) RemoveTracker(layer int32)
- func (s *StreamTrackerManager) SetListener(listener StreamTrackerManagerListener)
- func (s *StreamTrackerManager) SetMaxExpectedSpatialLayer(layer int32) int32
- func (s *StreamTrackerManager) UpdateTrackInfo(ti *livekit.TrackInfo)
- type StreamTrackerManagerConfig
- type StreamTrackerManagerListener
- type StreamTrackerPacketConfig
- type StreamTrackerType
- type TrackReceiver
- type TrackRemote
- type TrackRemoteFromSdp
- type TrackSender
- type TranslationParams
- type TranslationParamsRTP
- type VideoAllocation
- type VideoAllocationProvisional
- type VideoPauseReason
- type VideoTransition
- type WebRTCReceiver
- func (w *WebRTCReceiver) AddUpTrack(track TrackRemote, buff *buffer.Buffer) error
- func (w *WebRTCReceiver) DebugInfo() map[string]any
- func (w *WebRTCReceiver) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality)
- func (w *WebRTCReceiver) GetDeltaStats() map[uint32]*buffer.StreamStatsWithLayers
- func (w *WebRTCReceiver) GetLastSenderReportTime() time.Time
- func (w *WebRTCReceiver) NumUpTracks() int
- func (w *WebRTCReceiver) OnAvailableLayersChanged()
- func (w *WebRTCReceiver) OnBitrateAvailabilityChanged()
- func (w *WebRTCReceiver) OnBitrateReport(availableLayers []int32, bitrates Bitrates)
- func (w *WebRTCReceiver) OnCloseHandler(fn func())
- func (w *WebRTCReceiver) OnMaxAvailableLayerChanged(maxAvailableLayer int32)
- func (w *WebRTCReceiver) OnMaxPublishedLayerChanged(maxPublishedLayer int32)
- func (w *WebRTCReceiver) OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)
- func (w *WebRTCReceiver) OnStatsUpdate(fn func(w *WebRTCReceiver, stat *livekit.AnalyticsStat))
- func (w *WebRTCReceiver) SetMaxExpectedSpatialLayer(layer int32)
- func (w *WebRTCReceiver) UpdateTrackInfo(ti *livekit.TrackInfo)
Constants ¶
const ( RTPPaddingMaxPayloadSize = 255 RTPPaddingEstimatedHeaderSize = 20 RTPBlankFramesMuteSeconds = float32(1.0) RTPBlankFramesCloseSeconds = float32(0.2) FlagStopRTXOnPLI = true )
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 )
const (
RtxGateWindow = 2000
)
Variables ¶
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, } // PCMU (G.711 µ-law) silence frame - 0xff represents zero amplitude // 160 samples = 20ms at 8kHz sample rate PCMUSilenceFrame = []byte{}/* 160 elements not displayed */ // PCMA (G.711 A-law) silence frame - 0xd5 represents zero amplitude // 160 samples = 20ms at 8kHz sample rate PCMASilenceFrame = []byte{}/* 160 elements not displayed */ )
var ( ErrReceiverClosed = errors.New("receiver closed") ErrDownTrackAlreadyExist = errors.New("DownTrack already exist") ErrDuplicateLayer = errors.New("duplicate layer") ErrInvalidLayer = errors.New("invalid layer") )
var ( ErrIncompleteRedHeader = errors.New("incomplete red block header") ErrIncompleteRedBlock = errors.New("incomplete red block payload") )
var ( PacketFactory = &sync.Pool{ New: func() any { b := make([]byte, 1460) return &b }, } RTPHeaderFactory = &sync.Pool{ New: func() any { return &rtp.Header{} }, } )
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, } 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, } )
var ( DefaultAudioConfig = AudioConfig{ AudioLevelConfig: audio.DefaultAudioLevelConfig, } )
var ( DefaultPLIThrottleConfig = PLIThrottleConfig{ LowQuality: 500 * time.Millisecond, MidQuality: time.Second, HighQuality: time.Second, } )
var ( DefaultStreamTrackerManagerConfig = StreamTrackerManagerConfig{ Video: DefaultStreamTrackerConfigVideo, Screenshare: DefaultStreamTrackerConfigScreenshare, } )
var ( VideoAllocationDefault = VideoAllocation{ PauseReason: VideoPauseReasonFeedDry, TargetLayer: buffer.InvalidLayer, RequestLayerSpatial: buffer.InvalidLayerSpatial, MaxLayer: buffer.InvalidLayer, } )
Functions ¶
This section is empty.
Types ¶
type AudioConfig ¶
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 ¶
type Bitrates [buffer.DefaultMaxLayerSpatial + 1][buffer.DefaultMaxLayerTemporal + 1]int64
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 ¶
func (d *DownTrack) AllocateNextHigher(availableChannelCapacity int64, allowOvershoot bool) (VideoAllocation, bool)
func (*DownTrack) AllocateOptimal ¶
func (d *DownTrack) AllocateOptimal(allowOvershoot bool, hold bool) VideoAllocation
func (*DownTrack) BandwidthRequested ¶
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) CloseWithFlush ¶
CloseWithFlush - `flush` used to indicate whether send blank frame to flush decoder of client.
- When transceiver of this track is reused by some other participant's video track, set flush=true to avoid previous video shows before new stream is displayed.
- 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) DistanceToDesired ¶
func (*DownTrack) GetConnectionScoreAndQuality ¶
func (d *DownTrack) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality)
func (*DownTrack) GetDeltaStatsSender ¶
func (d *DownTrack) GetDeltaStatsSender() map[uint32]*buffer.StreamStatsWithLayers
func (*DownTrack) GetNackStats ¶
func (*DownTrack) GetNextHigherTransition ¶
func (d *DownTrack) GetNextHigherTransition(allowOvershoot bool) (VideoTransition, bool)
func (*DownTrack) GetPrimaryStreamLastReceiverReportTime ¶
func (*DownTrack) GetPrimaryStreamPacketsSent ¶
func (*DownTrack) GetState ¶
func (d *DownTrack) GetState() DownTrackState
func (*DownTrack) GetTrackStats ¶
func (*DownTrack) GetTransceiver ¶
func (d *DownTrack) GetTransceiver() *webrtc.RTPTransceiver
func (*DownTrack) HandleRTCPSenderReportData ¶
func (d *DownTrack) HandleRTCPSenderReportData( _payloadType webrtc.PayloadType, layer int32, publisherSRData *livekit.RTCPSenderReportState, ) error
func (*DownTrack) ID ¶
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) IsDeficient ¶
func (*DownTrack) Kind ¶
func (d *DownTrack) Kind() webrtc.RTPCodecType
Kind controls if this TrackLocal is audio or video
func (*DownTrack) MaxLayer ¶
func (d *DownTrack) MaxLayer() buffer.VideoLayer
func (*DownTrack) OnStatsUpdate ¶
func (d *DownTrack) OnStatsUpdate(fn func(d *DownTrack, stat *livekit.AnalyticsStat))
OnStatsUpdate registers an additional callback that fires alongside the configured DownTrackListener whenever connection-quality stats are produced. Intended for tests and observers; the production listener path is unaffected.
func (*DownTrack) Pause ¶
func (d *DownTrack) Pause() VideoAllocation
func (*DownTrack) ProvisionalAllocate ¶
func (*DownTrack) ProvisionalAllocateCommit ¶
func (d *DownTrack) ProvisionalAllocateCommit() VideoAllocation
func (*DownTrack) ProvisionalAllocateGetBestWeightedTransition ¶
func (d *DownTrack) ProvisionalAllocateGetBestWeightedTransition() VideoTransition
func (*DownTrack) ProvisionalAllocateGetCooperativeTransition ¶
func (d *DownTrack) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) VideoTransition
func (*DownTrack) ProvisionalAllocatePrepare ¶
func (d *DownTrack) ProvisionalAllocatePrepare()
func (*DownTrack) ProvisionalAllocateReset ¶
func (d *DownTrack) ProvisionalAllocateReset()
func (*DownTrack) Receiver ¶
func (d *DownTrack) Receiver() TrackReceiver
func (*DownTrack) ReceiverRestart ¶
func (d *DownTrack) ReceiverRestart(rcvr TrackReceiver)
func (*DownTrack) SeedState ¶
func (d *DownTrack) SeedState(state DownTrackState)
func (*DownTrack) SetActivePaddingOnMuteUpTrack ¶
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 ¶
func (d *DownTrack) SetConnected()
func (*DownTrack) SetMaxSpatialLayer ¶
func (*DownTrack) SetMaxTemporalLayer ¶
func (*DownTrack) SetProbeClusterId ¶
func (d *DownTrack) SetProbeClusterId(probeClusterId ccutils.ProbeClusterId)
func (*DownTrack) SetReceiver ¶
func (d *DownTrack) SetReceiver(r TrackReceiver)
func (*DownTrack) SetStreamAllocatorListener ¶
func (d *DownTrack) SetStreamAllocatorListener(listener DownTrackStreamAllocatorListener)
func (*DownTrack) SetTransceiver ¶
func (d *DownTrack) SetTransceiver(transceiver *webrtc.RTPTransceiver)
func (*DownTrack) StopWriteAndGetState ¶
func (d *DownTrack) StopWriteAndGetState() DownTrackState
func (*DownTrack) SubscriberID ¶
func (d *DownTrack) SubscriberID() livekit.ParticipantID
func (*DownTrack) SwapProbeClusterId ¶
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 ¶
func (d *DownTrack) UpTrackBitrateAvailabilityChange()
func (*DownTrack) UpTrackBitrateReport ¶
func (*DownTrack) UpTrackLayersChange ¶
func (d *DownTrack) UpTrackLayersChange()
func (*DownTrack) UpTrackMaxPublishedLayerChange ¶
func (*DownTrack) UpTrackMaxTemporalLayerSeenChange ¶
func (*DownTrack) WritePaddingRTP ¶
WritePaddingRTP tries to write as many padding only RTP packets as necessary to satisfy given size to the DownTrack
func (*DownTrack) WriteProbePackets ¶
type DownTrackListener ¶
type DownTrackListener interface {
OnBindAndConnected()
OnStatsUpdate(stat *livekit.AnalyticsStat)
OnMaxSubscribedLayerChanged(layer int32)
OnRttUpdate(rtt uint32)
OnCodecNegotiated(webrtc.RTPCodecCapability)
OnDownTrackClose(isExpectedToResume bool)
OnStreamStarted()
}
type DownTrackParams ¶
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
StripPacketTrailer bool
Listener DownTrackListener
}
type DownTrackState ¶
type DownTrackState struct {
RTPStats *rtpstats.RTPStatsSender
DeltaStatsSenderSnapshotId uint32
RTPStatsRTX *rtpstats.RTPStatsSender
DeltaStatsRTXSenderSnapshotId uint32
ForwarderState *livekit.RTPForwarderState
PlayoutDelayControllerState PlayoutDelayControllerState
}
func (DownTrackState) MarshalLogObject ¶
func (d DownTrackState) MarshalLogObject(e zapcore.ObjectEncoder) error
type DownTrackStreamAllocatorListener ¶
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 ¶
type ForwardStats struct {
// contains filtered or unexported fields
}
func NewForwardStats ¶
func NewForwardStats(latencyUpdateInterval, reportInterval, latencyWindowLength time.Duration) *ForwardStats
func (*ForwardStats) GetShortStats ¶
func (*ForwardStats) Stop ¶
func (s *ForwardStats) Stop()
type Forwarder ¶
type Forwarder struct {
// contains filtered or unexported fields
}
func NewForwarder ¶
func NewForwarder( kind webrtc.RTPCodecType, logger logger.Logger, skipReferenceTS bool, disableOpportunisticAllocation bool, rtpStats *rtpstats.RTPStatsSender, ) *Forwarder
func (*Forwarder) AllocateNextHigher ¶
func (*Forwarder) AllocateOptimal ¶
func (*Forwarder) BandwidthRequested ¶
func (*Forwarder) CurrentLayer ¶
func (f *Forwarder) CurrentLayer() buffer.VideoLayer
func (*Forwarder) DetermineCodec ¶
func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions []webrtc.RTPHeaderExtensionParameter, videoLayerMode livekit.VideoLayer_Mode)
func (*Forwarder) DistanceToDesired ¶
func (*Forwarder) GetMaxSubscribedSpatial ¶
func (*Forwarder) GetNextHigherTransition ¶
func (f *Forwarder) GetNextHigherTransition(brs Bitrates, allowOvershoot bool) (VideoTransition, bool)
func (*Forwarder) GetOptimalBandwidthNeeded ¶
func (*Forwarder) GetSenderReportParams ¶
func (*Forwarder) GetSnTsForBlankFrames ¶
func (*Forwarder) GetSnTsForPadding ¶
func (*Forwarder) GetState ¶
func (f *Forwarder) GetState() *livekit.RTPForwarderState
func (*Forwarder) GetTranslationParams ¶
func (*Forwarder) IsAnyMuted ¶
func (*Forwarder) IsDeficient ¶
func (*Forwarder) IsPubMuted ¶
func (*Forwarder) MaxLayer ¶
func (f *Forwarder) MaxLayer() buffer.VideoLayer
func (*Forwarder) Pause ¶
func (f *Forwarder) Pause(availableLayers []int32, brs Bitrates) VideoAllocation
func (*Forwarder) PauseReason ¶
func (f *Forwarder) PauseReason() VideoPauseReason
func (*Forwarder) ProvisionalAllocate ¶
func (*Forwarder) ProvisionalAllocateCommit ¶
func (f *Forwarder) ProvisionalAllocateCommit() VideoAllocation
func (*Forwarder) ProvisionalAllocateGetBestWeightedTransition ¶
func (f *Forwarder) ProvisionalAllocateGetBestWeightedTransition() (VideoTransition, []int32, Bitrates)
func (*Forwarder) ProvisionalAllocateGetCooperativeTransition ¶
func (f *Forwarder) ProvisionalAllocateGetCooperativeTransition(allowOvershoot bool) (VideoTransition, []int32, Bitrates)
func (*Forwarder) ProvisionalAllocatePrepare ¶
func (*Forwarder) ProvisionalAllocateReset ¶
func (f *Forwarder) ProvisionalAllocateReset()
func (*Forwarder) RTPMungerDebugInfo ¶
func (*Forwarder) SeedState ¶
func (f *Forwarder) SeedState(state *livekit.RTPForwarderState)
func (*Forwarder) SetMaxPublishedLayer ¶
func (*Forwarder) SetMaxSpatialLayer ¶
func (f *Forwarder) SetMaxSpatialLayer(spatialLayer int32) (bool, buffer.VideoLayer)
func (*Forwarder) SetMaxTemporalLayer ¶
func (f *Forwarder) SetMaxTemporalLayer(temporalLayer int32) (bool, buffer.VideoLayer)
func (*Forwarder) SetMaxTemporalLayerSeen ¶
func (*Forwarder) SetRefSenderReport ¶
func (f *Forwarder) SetRefSenderReport(layer int32, srData *livekit.RTCPSenderReportState)
func (*Forwarder) TargetLayer ¶
func (f *Forwarder) TargetLayer() buffer.VideoLayer
type PLIThrottleConfig ¶
type PlayoutDelayController ¶
type PlayoutDelayController struct {
// contains filtered or unexported fields
}
func NewPlayoutDelayController ¶
func NewPlayoutDelayController(minDelay, maxDelay uint32, logger logger.Logger, rtpStats *rtpstats.RTPStatsSender) (*PlayoutDelayController, error)
func (*PlayoutDelayController) GetDelayExtension ¶
func (c *PlayoutDelayController) GetDelayExtension(seq uint16) []byte
func (*PlayoutDelayController) GetState ¶
func (c *PlayoutDelayController) GetState() PlayoutDelayControllerState
func (*PlayoutDelayController) OnSeqAcked ¶
func (c *PlayoutDelayController) OnSeqAcked(seq uint16)
func (*PlayoutDelayController) SeedState ¶
func (c *PlayoutDelayController) SeedState(pdcs PlayoutDelayControllerState)
func (*PlayoutDelayController) SetJitter ¶
func (c *PlayoutDelayController) SetJitter(jitter uint32)
type PlayoutDelayControllerState ¶
type PlayoutDelayControllerState struct {
SenderSnapshotID uint32
}
func (PlayoutDelayControllerState) MarshalLogObject ¶
func (p PlayoutDelayControllerState) MarshalLogObject(e zapcore.ObjectEncoder) error
type PlayoutDelayState ¶
type PlayoutDelayState int32
const ( PlayoutDelayStateChanged PlayoutDelayState = iota PlayoutDelaySending PlayoutDelayAcked )
func (PlayoutDelayState) String ¶
func (s PlayoutDelayState) String() string
type REDTransformer ¶
type REDTransformer interface {
TrackReceiver
ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32
ForwardRTCPSenderReport(
payloadType webrtc.PayloadType,
layer int32,
publisherSRData *livekit.RTCPSenderReportState,
)
GetDownTracks() []TrackSender
ResyncDownTracks()
OnStreamRestart()
CanClose() bool
Close()
}
func NewRedPrimaryReceiver ¶
func NewRedPrimaryReceiver(receiver TrackReceiver, dsp utils.DownTrackSpreaderParams) REDTransformer
func NewRedReceiver ¶
func NewRedReceiver(receiver TrackReceiver, dsp utils.DownTrackSpreaderParams) REDTransformer
type RTPMunger ¶
type RTPMunger struct {
// contains filtered or unexported fields
}
func NewRTPMunger ¶
func (*RTPMunger) GetExtLastTimestamp ¶
func (*RTPMunger) GetState ¶
func (r *RTPMunger) GetState() *livekit.RTPMungerState
func (*RTPMunger) GetTSOffset ¶
func (*RTPMunger) IsOnFrameBoundary ¶
func (*RTPMunger) PacketDropped ¶
func (*RTPMunger) SeedState ¶
func (r *RTPMunger) SeedState(state *livekit.RTPMungerState)
func (*RTPMunger) SetLastSnTs ¶
func (*RTPMunger) UpdateAndGetPaddingSnTs ¶
func (*RTPMunger) UpdateAndGetSnTs ¶
type ReceiverBase ¶
type ReceiverBase struct {
// contains filtered or unexported fields
}
func NewReceiverBase ¶
func NewReceiverBase(params ReceiverBaseParams, trackInfo *livekit.TrackInfo, codecState ReceiverCodecState) *ReceiverBase
func (*ReceiverBase) AddBuffer ¶
func (r *ReceiverBase) AddBuffer(buff buffer.BufferProvider, layer int32)
func (*ReceiverBase) AddDownTrack ¶
func (r *ReceiverBase) AddDownTrack(track TrackSender) error
func (*ReceiverBase) AddOnCodecStateChange ¶
func (r *ReceiverBase) AddOnCodecStateChange(f func(webrtc.RTPCodecParameters, ReceiverCodecState))
func (*ReceiverBase) AddOnReady ¶
func (r *ReceiverBase) AddOnReady(fn func())
func (*ReceiverBase) CanClose ¶
func (r *ReceiverBase) CanClose() bool
func (*ReceiverBase) ClearAllBuffers ¶
func (r *ReceiverBase) ClearAllBuffers(reason string)
func (*ReceiverBase) Close ¶
func (r *ReceiverBase) Close(reason string, clearBuffers bool)
func (*ReceiverBase) Codec ¶
func (r *ReceiverBase) Codec() webrtc.RTPCodecParameters
func (*ReceiverBase) CodecState ¶
func (r *ReceiverBase) CodecState() ReceiverCodecState
func (*ReceiverBase) DebugInfo ¶
func (r *ReceiverBase) DebugInfo() map[string]any
func (*ReceiverBase) DeleteDownTrack ¶
func (r *ReceiverBase) DeleteDownTrack(subscriberID livekit.ParticipantID)
func (*ReceiverBase) GetAllBuffers ¶
func (r *ReceiverBase) GetAllBuffers() [buffer.DefaultMaxLayerSpatial + 1]buffer.BufferProvider
func (*ReceiverBase) GetAudioLevel ¶
func (r *ReceiverBase) GetAudioLevel() (float64, bool)
func (*ReceiverBase) GetDownTracks ¶
func (r *ReceiverBase) GetDownTracks() []TrackSender
func (*ReceiverBase) GetLayeredBitrate ¶
func (r *ReceiverBase) GetLayeredBitrate() ([]int32, Bitrates)
func (*ReceiverBase) GetOrCreateBuffer ¶
func (r *ReceiverBase) GetOrCreateBuffer(layer int32) buffer.BufferProvider
func (*ReceiverBase) GetPrimaryReceiverForRed ¶
func (r *ReceiverBase) GetPrimaryReceiverForRed() TrackReceiver
func (*ReceiverBase) GetRedReceiver ¶
func (r *ReceiverBase) GetRedReceiver() TrackReceiver
func (*ReceiverBase) GetTemporalLayerFpsForSpatial ¶
func (r *ReceiverBase) GetTemporalLayerFpsForSpatial(layer int32) []float32
func (*ReceiverBase) GetTrackStats ¶
func (r *ReceiverBase) GetTrackStats() *livekit.RTPStats
func (*ReceiverBase) HeaderExtensions ¶
func (r *ReceiverBase) HeaderExtensions() []webrtc.RTPHeaderExtensionParameter
func (*ReceiverBase) IsClosed ¶
func (r *ReceiverBase) IsClosed() bool
func (*ReceiverBase) Kind ¶
func (r *ReceiverBase) Kind() webrtc.RTPCodecType
func (*ReceiverBase) Logger ¶
func (r *ReceiverBase) Logger() logger.Logger
func (*ReceiverBase) Mime ¶
func (r *ReceiverBase) Mime() mime.MimeType
func (*ReceiverBase) OnAvailableLayersChanged ¶
func (r *ReceiverBase) OnAvailableLayersChanged()
StreamTrackerManagerListener.OnAvailableLayersChanged
func (*ReceiverBase) OnBitrateAvailabilityChanged ¶
func (r *ReceiverBase) OnBitrateAvailabilityChanged()
StreamTrackerManagerListener.OnBitrateAvailabilityChanged
func (*ReceiverBase) OnBitrateReport ¶
func (r *ReceiverBase) OnBitrateReport(availableLayers []int32, bitrates Bitrates)
StreamTrackerManagerListener.OnBitrateReport
func (*ReceiverBase) OnMaxAvailableLayerChanged ¶
func (r *ReceiverBase) OnMaxAvailableLayerChanged(maxAvailableLayer int32)
StreamTrackerManagerListener.OnMaxAvailableLayerChanged
func (*ReceiverBase) OnMaxLayerChange ¶
func (r *ReceiverBase) OnMaxLayerChange(fn func(mimeType mime.MimeType, maxLayer int32))
func (*ReceiverBase) OnMaxPublishedLayerChanged ¶
func (r *ReceiverBase) OnMaxPublishedLayerChanged(maxPublishedLayer int32)
StreamTrackerManagerListener.OnMaxPublishedLayerChanged
func (*ReceiverBase) OnMaxTemporalLayerSeenChanged ¶
func (r *ReceiverBase) OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)
StreamTrackerManagerListener.OnMaxTemporalLayerSeenChanged
func (*ReceiverBase) OnVideoSizeChanged ¶
func (r *ReceiverBase) OnVideoSizeChanged(f func())
func (*ReceiverBase) Restart ¶
func (r *ReceiverBase) Restart(reason string)
func (*ReceiverBase) SendPLI ¶
func (r *ReceiverBase) SendPLI(layer int32, force bool)
func (*ReceiverBase) SetAudioConfig ¶
func (r *ReceiverBase) SetAudioConfig(audioConfig AudioConfig)
func (*ReceiverBase) SetCodecState ¶
func (r *ReceiverBase) SetCodecState(state ReceiverCodecState)
func (*ReceiverBase) SetCodecWithState ¶
func (r *ReceiverBase) SetCodecWithState(codec webrtc.RTPCodecParameters, headerExtensions []webrtc.RTPHeaderExtensionParameter, codecState ReceiverCodecState)
func (*ReceiverBase) SetEnableRTPStreamRestartDetection ¶
func (r *ReceiverBase) SetEnableRTPStreamRestartDetection(enableRTPStremRestartDetection bool)
func (*ReceiverBase) SetForwardStats ¶
func (r *ReceiverBase) SetForwardStats(forwardStats *ForwardStats)
func (*ReceiverBase) SetLBThreshold ¶
func (r *ReceiverBase) SetLBThreshold(lbThreshold int)
func (*ReceiverBase) SetMaxExpectedSpatialLayer ¶
func (r *ReceiverBase) SetMaxExpectedSpatialLayer(layer int32)
func (*ReceiverBase) SetPLIThrottleConfig ¶
func (r *ReceiverBase) SetPLIThrottleConfig(pliThrottleConfig PLIThrottleConfig)
func (*ReceiverBase) SetRTT ¶
func (r *ReceiverBase) SetRTT(rtt uint32)
func (*ReceiverBase) StartBuffer ¶
func (r *ReceiverBase) StartBuffer(buff buffer.BufferProvider, layer int32)
func (*ReceiverBase) StreamID ¶
func (r *ReceiverBase) StreamID() string
func (*ReceiverBase) StreamTrackerManager ¶
func (r *ReceiverBase) StreamTrackerManager() *StreamTrackerManager
func (*ReceiverBase) TrackID ¶
func (r *ReceiverBase) TrackID() livekit.TrackID
func (*ReceiverBase) TrackInfo ¶
func (r *ReceiverBase) TrackInfo() *livekit.TrackInfo
func (*ReceiverBase) UpdateTrackInfo ¶
func (r *ReceiverBase) UpdateTrackInfo(ti *livekit.TrackInfo)
func (*ReceiverBase) VideoLayerMode ¶
func (r *ReceiverBase) VideoLayerMode() livekit.VideoLayer_Mode
func (*ReceiverBase) VideoSizes ¶
func (r *ReceiverBase) VideoSizes() []codec.VideoSize
type ReceiverBaseParams ¶
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
OnNewBufferNeeded func(int32, *livekit.TrackInfo) (buffer.BufferProvider, error)
OnClosed func()
}
type ReceiverCodecState ¶
type ReceiverCodecState int
const ( ReceiverCodecStateNormal ReceiverCodecState = iota ReceiverCodecStateSuspended ReceiverCodecStateInvalid )
type ReceiverOpts ¶
type ReceiverOpts func(w *WebRTCReceiver) *WebRTCReceiver
func WithAudioConfig ¶
func WithAudioConfig(audioConfig AudioConfig) ReceiverOpts
WithAudioConfig sets up parameters for active speaker detection
func WithEnableRTPStreamRestartDetection ¶
func WithEnableRTPStreamRestartDetection(enable bool) ReceiverOpts
func WithForwardStats ¶
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 ¶
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 ¶
type RedPrimaryReceiver struct {
TrackReceiver
// contains filtered or unexported fields
}
func (*RedPrimaryReceiver) AddDownTrack ¶
func (r *RedPrimaryReceiver) AddDownTrack(track TrackSender) error
func (*RedPrimaryReceiver) CanClose ¶
func (r *RedPrimaryReceiver) CanClose() bool
func (*RedPrimaryReceiver) Close ¶
func (r *RedPrimaryReceiver) Close()
func (*RedPrimaryReceiver) DeleteDownTrack ¶
func (r *RedPrimaryReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)
func (*RedPrimaryReceiver) ForwardRTCPSenderReport ¶
func (r *RedPrimaryReceiver) ForwardRTCPSenderReport( payloadType webrtc.PayloadType, layer int32, publisherSRData *livekit.RTCPSenderReportState, )
func (*RedPrimaryReceiver) ForwardRTP ¶
func (r *RedPrimaryReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32
func (*RedPrimaryReceiver) GetDownTracks ¶
func (r *RedPrimaryReceiver) GetDownTracks() []TrackSender
func (*RedPrimaryReceiver) IsClosed ¶
func (r *RedPrimaryReceiver) IsClosed() bool
func (*RedPrimaryReceiver) OnStreamRestart ¶
func (r *RedPrimaryReceiver) OnStreamRestart()
func (*RedPrimaryReceiver) ResyncDownTracks ¶
func (r *RedPrimaryReceiver) ResyncDownTracks()
type RedReceiver ¶
type RedReceiver struct {
TrackReceiver
// contains filtered or unexported fields
}
func (*RedReceiver) AddDownTrack ¶
func (r *RedReceiver) AddDownTrack(track TrackSender) error
func (*RedReceiver) CanClose ¶
func (r *RedReceiver) CanClose() bool
func (*RedReceiver) Close ¶
func (r *RedReceiver) Close()
func (*RedReceiver) DeleteDownTrack ¶
func (r *RedReceiver) DeleteDownTrack(subscriberID livekit.ParticipantID)
func (*RedReceiver) ForwardRTCPSenderReport ¶
func (r *RedReceiver) ForwardRTCPSenderReport( payloadType webrtc.PayloadType, layer int32, publisherSRData *livekit.RTCPSenderReportState, )
func (*RedReceiver) ForwardRTP ¶
func (r *RedReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int32) int32
func (*RedReceiver) GetDownTracks ¶
func (r *RedReceiver) GetDownTracks() []TrackSender
func (*RedReceiver) IsClosed ¶
func (r *RedReceiver) IsClosed() bool
func (*RedReceiver) OnStreamRestart ¶
func (r *RedReceiver) OnStreamRestart()
func (*RedReceiver) ResyncDownTracks ¶
func (r *RedReceiver) ResyncDownTracks()
type SequenceNumberOrdering ¶
type SequenceNumberOrdering int
RTPMunger
const ( SequenceNumberOrderingContiguous SequenceNumberOrdering = iota SequenceNumberOrderingOutOfOrder SequenceNumberOrderingGap SequenceNumberOrderingDuplicate )
type StreamTrackerConfig ¶
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 ¶
type StreamTrackerFrameConfig struct {
MinFPS float64 `yaml:"min_fps,omitempty"`
}
type StreamTrackerManager ¶
type StreamTrackerManager struct {
// contains filtered or unexported fields
}
func NewStreamTrackerManager ¶
func NewStreamTrackerManager( logger logger.Logger, trackInfo *livekit.TrackInfo, mimeType mime.MimeType, clockRate uint32, config StreamTrackerManagerConfig, ) *StreamTrackerManager
func (*StreamTrackerManager) AddDependencyDescriptorTrackers ¶
func (s *StreamTrackerManager) AddDependencyDescriptorTrackers()
func (*StreamTrackerManager) AddTracker ¶
func (s *StreamTrackerManager) AddTracker(layer int32) streamtracker.StreamTrackerWorker
func (*StreamTrackerManager) Close ¶
func (s *StreamTrackerManager) Close()
func (*StreamTrackerManager) DistanceToDesired ¶
func (s *StreamTrackerManager) DistanceToDesired() float64
func (*StreamTrackerManager) GetLayeredBitrate ¶
func (s *StreamTrackerManager) GetLayeredBitrate() ([]int32, Bitrates)
func (*StreamTrackerManager) GetMaxPublishedLayer ¶
func (s *StreamTrackerManager) GetMaxPublishedLayer() int32
func (*StreamTrackerManager) GetMaxTemporalLayerSeen ¶
func (s *StreamTrackerManager) GetMaxTemporalLayerSeen() int32
func (*StreamTrackerManager) GetTracker ¶
func (s *StreamTrackerManager) GetTracker(layer int32) streamtracker.StreamTrackerWorker
func (*StreamTrackerManager) RemoveAllTrackers ¶
func (s *StreamTrackerManager) RemoveAllTrackers()
func (*StreamTrackerManager) RemoveTracker ¶
func (s *StreamTrackerManager) RemoveTracker(layer int32)
func (*StreamTrackerManager) SetListener ¶
func (s *StreamTrackerManager) SetListener(listener StreamTrackerManagerListener)
func (*StreamTrackerManager) SetMaxExpectedSpatialLayer ¶
func (s *StreamTrackerManager) SetMaxExpectedSpatialLayer(layer int32) int32
func (*StreamTrackerManager) UpdateTrackInfo ¶
func (s *StreamTrackerManager) UpdateTrackInfo(ti *livekit.TrackInfo)
type StreamTrackerManagerConfig ¶
type StreamTrackerManagerConfig struct {
Video StreamTrackerConfig `yaml:"video,omitempty"`
}
type StreamTrackerManagerListener ¶
type StreamTrackerManagerListener interface {
OnAvailableLayersChanged()
OnBitrateAvailabilityChanged()
OnMaxPublishedLayerChanged(maxPublishedLayer int32)
OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)
OnMaxAvailableLayerChanged(maxAvailableLayer int32)
OnBitrateReport(availableLayers []int32, bitrates Bitrates)
}
type StreamTrackerType ¶
type StreamTrackerType string
const ( StreamTrackerTypePacket StreamTrackerType = "packet" StreamTrackerTypeFrame StreamTrackerType = "frame" )
type TrackReceiver ¶
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)
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() []codec.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 ¶
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 ¶
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 ¶
func NewTrackRemoteFromSdp(track *webrtc.TrackRemote, codec webrtc.RTPCodecParameters) *TrackRemoteFromSdp
func (*TrackRemoteFromSdp) Codec ¶
func (t *TrackRemoteFromSdp) Codec() webrtc.RTPCodecParameters
func (*TrackRemoteFromSdp) RTCTrack ¶
func (t *TrackRemoteFromSdp) RTCTrack() *webrtc.TrackRemote
type TrackSender ¶
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(TrackReceiver)
}
TrackSender defines an interface send media to remote peer
type TranslationParams ¶
type TranslationParams struct {
// contains filtered or unexported fields
}
type TranslationParamsRTP ¶
type TranslationParamsRTP struct {
// contains filtered or unexported fields
}
type VideoAllocation ¶
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 ¶
func (v *VideoAllocation) MarshalLogObject(e zapcore.ObjectEncoder) error
func (*VideoAllocation) String ¶
func (v *VideoAllocation) String() string
type VideoAllocationProvisional ¶
type VideoAllocationProvisional struct {
// contains filtered or unexported fields
}
type VideoPauseReason ¶
type VideoPauseReason int
const ( VideoPauseReasonNone VideoPauseReason = iota VideoPauseReasonMuted VideoPauseReasonPubMuted VideoPauseReasonFeedDry VideoPauseReasonBandwidth )
func (VideoPauseReason) String ¶
func (v VideoPauseReason) String() string
type VideoTransition ¶
type VideoTransition struct {
From buffer.VideoLayer
To buffer.VideoLayer
BandwidthDelta int64
}
func (*VideoTransition) MarshalLogObject ¶
func (v *VideoTransition) MarshalLogObject(e zapcore.ObjectEncoder) error
func (*VideoTransition) String ¶
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 ¶
func (w *WebRTCReceiver) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality)
func (*WebRTCReceiver) GetDeltaStats ¶
func (w *WebRTCReceiver) GetDeltaStats() map[uint32]*buffer.StreamStatsWithLayers
func (*WebRTCReceiver) GetLastSenderReportTime ¶
func (w *WebRTCReceiver) GetLastSenderReportTime() time.Time
func (*WebRTCReceiver) NumUpTracks ¶
func (w *WebRTCReceiver) NumUpTracks() int
func (*WebRTCReceiver) OnAvailableLayersChanged ¶
func (w *WebRTCReceiver) OnAvailableLayersChanged()
StreamTrackerManagerListener.OnAvailableLayersChanged
func (*WebRTCReceiver) OnBitrateAvailabilityChanged ¶
func (w *WebRTCReceiver) OnBitrateAvailabilityChanged()
StreamTrackerManagerListener.OnBitrateAvailabilityChanged
func (*WebRTCReceiver) OnBitrateReport ¶
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 ¶
func (w *WebRTCReceiver) OnMaxAvailableLayerChanged(maxAvailableLayer int32)
StreamTrackerManagerListener.OnMaxAvailableLayerChanged
func (*WebRTCReceiver) OnMaxPublishedLayerChanged ¶
func (w *WebRTCReceiver) OnMaxPublishedLayerChanged(maxPublishedLayer int32)
StreamTrackerManagerListener.OnMaxPublishedLayerChanged
func (*WebRTCReceiver) OnMaxTemporalLayerSeenChanged ¶
func (w *WebRTCReceiver) OnMaxTemporalLayerSeenChanged(maxTemporalLayerSeen int32)
StreamTrackerManagerListener.OnMaxTemporalLayerSeenChanged
func (*WebRTCReceiver) OnStatsUpdate ¶
func (w *WebRTCReceiver) OnStatsUpdate(fn func(w *WebRTCReceiver, stat *livekit.AnalyticsStat))
func (*WebRTCReceiver) SetMaxExpectedSpatialLayer ¶
func (w *WebRTCReceiver) SetMaxExpectedSpatialLayer(layer int32)
func (*WebRTCReceiver) UpdateTrackInfo ¶
func (w *WebRTCReceiver) UpdateTrackInfo(ti *livekit.TrackInfo)