buffer

package
v0.0.0-...-95199c0 Latest Latest
Warning

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

Go to latest
Published: May 20, 2026 License: Apache-2.0 Imports: 33 Imported by: 0

Documentation

Index

Constants

View Source
const (
	InitPacketBufferSizeVideo = 300
	InitPacketBufferSizeAudio = 70
)
View Source
const (
	InvalidLayerSpatial  = int32(-1)
	InvalidLayerTemporal = int32(-1)

	DefaultMaxLayerSpatial  = int32(2)
	DefaultMaxLayerTemporal = int32(3)
)

Variables

View Source
var (
	ErrFrameEarlierThanKeyFrame            = fmt.Errorf("frame is earlier than current keyframe")
	ErrDDStructureAttachedToNonFirstPacket = fmt.Errorf("dependency descriptor structure is attached to non-first packet of a frame")
	ErrDDExtentionNotFound                 = fmt.Errorf("dependency descriptor extension not found")
)
View Source
var (
	InvalidLayer = VideoLayer{
		Spatial:  InvalidLayerSpatial,
		Temporal: InvalidLayerTemporal,
	}

	DefaultMaxLayer = VideoLayer{
		Spatial:  DefaultMaxLayerSpatial,
		Temporal: DefaultMaxLayerTemporal,
	}
)
View Source
var (
	DefaultVideoLayersRid = videoLayersRidQHF
)
View Source
var (
	ExtDependencyDescriptorFactory = &sync.Pool{
		New: func() any {
			return &ExtDependencyDescriptor{}
		},
	}
)
View Source
var (
	ExtPacketFactory = &sync.Pool{
		New: func() any {
			return &ExtPacket{}
		},
	}
)

Functions

func ExtractDependencyDescriptorVideoSize

func ExtractDependencyDescriptorVideoSize(dd *dd.DependencyDescriptor) []codec.VideoSize

func GetActiveDecodeTargetBitmask

func GetActiveDecodeTargetBitmask(layer VideoLayer, decodeTargets []DependencyDescriptorDecodeTarget) *uint32

func GetSpatialLayerForRid

func GetSpatialLayerForRid(mimeType mime.MimeType, rid string, ti *livekit.TrackInfo) int32

func GetSpatialLayerForVideoQuality

func GetSpatialLayerForVideoQuality(mimeType mime.MimeType, quality livekit.VideoQuality, ti *livekit.TrackInfo) int32

func GetVideoLayerModeForMimeType

func GetVideoLayerModeForMimeType(mimeType mime.MimeType, ti *livekit.TrackInfo) livekit.VideoLayer_Mode

func GetVideoLayersForMimeType

func GetVideoLayersForMimeType(mimeType mime.MimeType, ti *livekit.TrackInfo) []*livekit.VideoLayer

func GetVideoQualityForSpatialLayer

func GetVideoQualityForSpatialLayer(mimeType mime.MimeType, spatialLayer int32, ti *livekit.TrackInfo) livekit.VideoQuality

func LayerPresenceFromTrackInfo

func LayerPresenceFromTrackInfo(mimeType mime.MimeType, trackInfo *livekit.TrackInfo) *[livekit.VideoQuality_HIGH + 1]bool

func ReleaseExtDependencyDescriptor

func ReleaseExtDependencyDescriptor(extDD *ExtDependencyDescriptor)

func ReleaseExtPacket

func ReleaseExtPacket(extPkt *ExtPacket)

func RidToSpatialLayer

func RidToSpatialLayer(mimeType mime.MimeType, rid string, trackInfo *livekit.TrackInfo, ridSpace VideoLayersRid) int32

func SpatialLayerToRid

func SpatialLayerToRid(mimeType mime.MimeType, layer int32, trackInfo *livekit.TrackInfo, ridSpace VideoLayersRid) string

func SpatialLayerToVideoQuality

func SpatialLayerToVideoQuality(mimeType mime.MimeType, layer int32, trackInfo *livekit.TrackInfo) livekit.VideoQuality

func VideoQualityToRid

func VideoQualityToRid(mimeType mime.MimeType, quality livekit.VideoQuality, trackInfo *livekit.TrackInfo, ridSpace VideoLayersRid) string

func VideoQualityToSpatialLayer

func VideoQualityToSpatialLayer(mimeType mime.MimeType, quality livekit.VideoQuality, trackInfo *livekit.TrackInfo) int32

Types

type Buffer

type Buffer struct {
	*BufferBase
	// contains filtered or unexported fields
}

Buffer contains all packets

func NewBuffer

func NewBuffer(ssrc uint32, maxVideoPkts, maxAudioPkts int) *Buffer

func (*Buffer) Bind

func (b *Buffer) Bind(params webrtc.RTPParameters, codec webrtc.RTPCodecCapability, bitrates int) error

func (*Buffer) Close

func (b *Buffer) Close() error

func (*Buffer) NotifyRTX

func (b *Buffer) NotifyRTX(ssrc uint32, repairSSRC uint32, rsid string)

func (*Buffer) OnClose

func (b *Buffer) OnClose(fn func())

func (*Buffer) OnFinalRtpStats

func (b *Buffer) OnFinalRtpStats(fn func(*livekit.RTPStats))

func (*Buffer) OnNotifyRTX

func (b *Buffer) OnNotifyRTX(fn func(ssrc uint32, repairSSRC uint32, rsid string))

func (*Buffer) OnRtcpFeedback

func (b *Buffer) OnRtcpFeedback(fn func(fb []rtcp.Packet))

func (*Buffer) Read

func (b *Buffer) Read(buff []byte) (n int, err error)

func (*Buffer) SetAudioLossProxying

func (b *Buffer) SetAudioLossProxying(enable bool)

func (*Buffer) SetLastFractionLostReport

func (b *Buffer) SetLastFractionLostReport(lost uint8)

func (*Buffer) SetPrimaryBufferForRTX

func (b *Buffer) SetPrimaryBufferForRTX(primaryBuffer *Buffer)

func (*Buffer) SetTWCCAndExtID

func (b *Buffer) SetTWCCAndExtID(twcc *twcc.Responder, extID uint8)

func (*Buffer) Write

func (b *Buffer) Write(pkt []byte) (n int, err error)

Write adds an RTP Packet, ordering is not guaranteed, newer packets may arrive later

type BufferBase

type BufferBase struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func NewBufferBase

func NewBufferBase(params BufferBaseParams) *BufferBase

func (*BufferBase) Bind

func (b *BufferBase) Bind(rtpParameters webrtc.RTPParameters, codec webrtc.RTPCodecCapability, bitrate int) error

func (*BufferBase) BindLocked

func (b *BufferBase) BindLocked(rtpParameters webrtc.RTPParameters, codec webrtc.RTPCodecCapability, bitrate int) error

func (*BufferBase) CloseWithReason

func (b *BufferBase) CloseWithReason(reason string) (stats *livekit.RTPStats, err error)

func (*BufferBase) GetAudioLevel

func (b *BufferBase) GetAudioLevel() (float64, bool)

func (*BufferBase) GetDeltaStats

func (b *BufferBase) GetDeltaStats() *StreamStatsWithLayers

func (*BufferBase) GetDeltaStatsLite

func (b *BufferBase) GetDeltaStatsLite() *rtpstats.RTPDeltaInfoLite

func (*BufferBase) GetLastSenderReportTime

func (b *BufferBase) GetLastSenderReportTime() time.Time

func (*BufferBase) GetNACKPairs

func (b *BufferBase) GetNACKPairs() []rtcp.NackPair

func (*BufferBase) GetNACKPairsLocked

func (b *BufferBase) GetNACKPairsLocked() []rtcp.NackPair

func (*BufferBase) GetPacket

func (b *BufferBase) GetPacket(buff []byte, esn uint64) (int, error)

func (*BufferBase) GetRtcpReceptionReportLocked

func (b *BufferBase) GetRtcpReceptionReportLocked(proxyLoss uint8) *rtcp.ReceptionReport

func (*BufferBase) GetSenderReportData

func (b *BufferBase) GetSenderReportData() *livekit.RTCPSenderReportState

func (*BufferBase) GetStats

func (b *BufferBase) GetStats() *livekit.RTPStats

func (*BufferBase) GetTemporalLayerFpsForSpatial

func (b *BufferBase) GetTemporalLayerFpsForSpatial(layer int32) []float32

func (*BufferBase) HandleIncomingPacket

func (b *BufferBase) HandleIncomingPacket(
	rawPkt []byte,
	rtpPacket *rtp.Packet,
	arrivalTime int64,
	isBuffered bool,
	isRTX bool,
	skippedSeqs []uint16,
	oobSequenceNumber uint16,
) (uint64, error)

func (*BufferBase) HandleIncomingPacketLocked

func (b *BufferBase) HandleIncomingPacketLocked(
	rawPkt []byte,
	rtpPacket *rtp.Packet,
	arrivalTime int64,
	isBuffered bool,
	isRTX bool,
	skippedSeqs []uint16,
	oobSequenceNumber uint16,
) (uint64, error)

func (*BufferBase) IsClosed

func (b *BufferBase) IsClosed() bool

func (*BufferBase) MarkForRestartStream

func (b *BufferBase) MarkForRestartStream(reason string)

func (*BufferBase) MaxAudioPkts

func (b *BufferBase) MaxAudioPkts() int

func (*BufferBase) MaxVideoPkts

func (b *BufferBase) MaxVideoPkts() int

func (*BufferBase) NotifyRead

func (b *BufferBase) NotifyRead()

func (*BufferBase) OnCodecChange

func (b *BufferBase) OnCodecChange(fn func(webrtc.RTPCodecParameters))

func (*BufferBase) OnFpsChanged

func (b *BufferBase) OnFpsChanged(f func())

func (*BufferBase) OnRtcpSenderReport

func (b *BufferBase) OnRtcpSenderReport(fn func())

func (*BufferBase) OnStreamRestart

func (b *BufferBase) OnStreamRestart(fn func(string))

func (*BufferBase) OnVideoSizeChanged

func (b *BufferBase) OnVideoSizeChanged(fn func([]codec.VideoSize))

func (*BufferBase) ReadExtended

func (b *BufferBase) ReadExtended(buf []byte) (*ExtPacket, error)

func (*BufferBase) RestartOOBSequenceNumber

func (b *BufferBase) RestartOOBSequenceNumber(reason string)

func (*BufferBase) RestartStream

func (b *BufferBase) RestartStream(reason string)

func (*BufferBase) SSRC

func (b *BufferBase) SSRC() uint32

func (*BufferBase) SendPLI

func (b *BufferBase) SendPLI(force bool)

func (*BufferBase) SetAudioLevelConfig

func (b *BufferBase) SetAudioLevelConfig(audioLevelConfig audio.AudioLevelConfig)

func (*BufferBase) SetLogger

func (b *BufferBase) SetLogger(lgr logger.Logger)

func (*BufferBase) SetPLIThrottle

func (b *BufferBase) SetPLIThrottle(duration int64)

func (*BufferBase) SetPaused

func (b *BufferBase) SetPaused(paused bool)

func (*BufferBase) SetRTT

func (b *BufferBase) SetRTT(rtt uint32)

func (*BufferBase) SetSenderReportData

func (b *BufferBase) SetSenderReportData(srData *livekit.RTCPSenderReportState)

func (*BufferBase) SetStreamRestartDetection

func (b *BufferBase) SetStreamRestartDetection(enable bool)

func (*BufferBase) StartKeyFrameSeeder

func (b *BufferBase) StartKeyFrameSeeder()

func (*BufferBase) StopKeyFrameSeeder

func (b *BufferBase) StopKeyFrameSeeder()

func (*BufferBase) WaitRead

func (b *BufferBase) WaitRead()

type BufferBaseParams

type BufferBaseParams struct {
	SSRC                uint32
	MaxVideoPkts        int
	MaxAudioPkts        int
	LoggerComponents    []string
	SendPLI             func()
	IsReportingEnabled  bool
	IsOOBSequenceNumber bool
	IsDDRestartEnabled  bool
}

type BufferProvider

type BufferProvider interface {
	SetLogger(lgr logger.Logger)
	SetAudioLevelConfig(audioLevelConfig audio.AudioLevelConfig)
	SetStreamRestartDetection(enable bool)
	SetPLIThrottle(duration int64)
	SetRTT(rtt uint32)
	SetPaused(paused bool)

	SendPLI(force bool)

	ReadExtended(buf []byte) (*ExtPacket, error)
	GetPacket(buf []byte, esn uint64) (int, error)

	GetAudioLevel() (float64, bool)
	GetTemporalLayerFpsForSpatial(layer int32) []float32
	GetStats() *livekit.RTPStats
	GetDeltaStats() *StreamStatsWithLayers
	GetDeltaStatsLite() *rtpstats.RTPDeltaInfoLite
	GetLastSenderReportTime() time.Time
	GetNACKPairs() []rtcp.NackPair

	SetSenderReportData(srData *livekit.RTCPSenderReportState)
	GetSenderReportData() *livekit.RTCPSenderReportState

	OnRtcpSenderReport(fn func())
	OnFpsChanged(fn func())
	OnVideoSizeChanged(fn func([]codec.VideoSize))
	OnCodecChange(fn func(webrtc.RTPCodecParameters))
	OnStreamRestart(fn func(string))

	StartKeyFrameSeeder()
	StopKeyFrameSeeder()

	HandleIncomingPacket(
		rawPkt []byte,
		rtpPacket *rtp.Packet,
		arrivalTime int64,
		isBuffered bool,
		isRTX bool,
		skippedSeqs []uint16,
		oobSequenceNumber uint16,
	) (uint64, error)

	MarkForRestartStream(reason string)
	RestartStream(reason string)

	CloseWithReason(reason string) (*livekit.RTPStats, error)
}

type DataStats

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

func NewDataStats

func NewDataStats(params DataStatsParam) *DataStats

func (*DataStats) Stop

func (s *DataStats) Stop()

func (*DataStats) ToProtoActive

func (s *DataStats) ToProtoActive() *livekit.RTPStats

func (*DataStats) ToProtoAggregateOnly

func (s *DataStats) ToProtoAggregateOnly() *livekit.RTPStats

func (*DataStats) Update

func (s *DataStats) Update(bytes int, time int64)

type DataStatsParam

type DataStatsParam struct {
	WindowDuration time.Duration
}

type DependencyDescriptorDecodeTarget

type DependencyDescriptorDecodeTarget struct {
	Target int
	Layer  VideoLayer
}

func ProcessFrameDependencyStructure

func ProcessFrameDependencyStructure(structure *dd.FrameDependencyStructure) []DependencyDescriptorDecodeTarget

func (*DependencyDescriptorDecodeTarget) String

type DependencyDescriptorParser

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

func NewDependencyDescriptorParser

func NewDependencyDescriptorParser(ddExtID uint8, logger logger.Logger, onMaxLayerChanged func(int32, int32), enableRestart bool) *DependencyDescriptorParser

func (*DependencyDescriptorParser) Parse

type ExtDependencyDescriptor

type ExtDependencyDescriptor struct {
	Descriptor *dd.DependencyDescriptor

	DecodeTargets              []DependencyDescriptorDecodeTarget
	StructureUpdated           bool
	ActiveDecodeTargetsUpdated bool
	Integrity                  bool
	ExtFrameNum                uint64
	// the frame number of the keyframe which the current frame depends on
	ExtKeyFrameNum uint64

	// increase when the stream restarts, clear and reinitialize all dd state includes
	// attached structure, frame chain, decode target.
	RestartGeneration int
}

type ExtPacket

type ExtPacket struct {
	VideoLayer
	Arrival              int64
	ExtSequenceNumber    uint64
	ExtTimestamp         uint64
	Packet               *rtp.Packet
	Payload              any
	IsKeyFrame           bool
	RawPacket            []byte
	DependencyDescriptor *ExtDependencyDescriptor
	AbsCaptureTimeExt    *act.AbsCaptureTime
	IsOutOfOrder         bool
	IsBuffered           bool
}

type Factory

type Factory struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func (*Factory) GetBuffer

func (f *Factory) GetBuffer(ssrc uint32) *Buffer

func (*Factory) GetBufferPair

func (f *Factory) GetBufferPair(ssrc uint32) (*Buffer, *RTCPReader)

func (*Factory) GetOrNew

func (f *Factory) GetOrNew(packetType packetio.BufferPacketType, ssrc uint32) io.ReadWriteCloser

func (*Factory) GetRTCPReader

func (f *Factory) GetRTCPReader(ssrc uint32) *RTCPReader

func (*Factory) SetRTXPair

func (f *Factory) SetRTXPair(repair, base uint32, rsid string)

type FactoryOfBufferFactory

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

func NewFactoryOfBufferFactory

func NewFactoryOfBufferFactory(trackingPacketsVideo int, trackingPacketsAudio int) *FactoryOfBufferFactory

func (*FactoryOfBufferFactory) CreateBufferFactory

func (f *FactoryOfBufferFactory) CreateBufferFactory() *Factory

type FrameEntity

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

func (*FrameEntity) AddPacket

func (fe *FrameEntity) AddPacket(extSeq uint64, ddVal *dd.DependencyDescriptor)

func (*FrameEntity) Integrity

func (fe *FrameEntity) Integrity() bool

func (*FrameEntity) Reset

func (fe *FrameEntity) Reset()

type FrameIntegrityChecker

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

func NewFrameIntegrityChecker

func NewFrameIntegrityChecker(frameCount, packetCount int) *FrameIntegrityChecker

func (*FrameIntegrityChecker) AddPacket

func (fc *FrameIntegrityChecker) AddPacket(extSeq uint64, extFrameNum uint64, ddVal *dd.DependencyDescriptor)

func (*FrameIntegrityChecker) FrameIntegrity

func (fc *FrameIntegrityChecker) FrameIntegrity(extFrameNum uint64) bool

type FrameRateCalculator

type FrameRateCalculator interface {
	RecvPacket(ep *ExtPacket) bool
	GetFrameRate() []float32
	Completed() bool
}

type FrameRateCalculatorDD

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

FrameRateCalculator based on Dependency descriptor

func NewFrameRateCalculatorDD

func NewFrameRateCalculatorDD(clockRate uint32, logger logger.Logger) *FrameRateCalculatorDD

func (*FrameRateCalculatorDD) Completed

func (f *FrameRateCalculatorDD) Completed() bool

func (*FrameRateCalculatorDD) GetFrameRateCalculatorForSpatial

func (f *FrameRateCalculatorDD) GetFrameRateCalculatorForSpatial(spatial int32) *FrameRateCalculatorForDDLayer

func (*FrameRateCalculatorDD) GetFrameRateForSpatial

func (f *FrameRateCalculatorDD) GetFrameRateForSpatial(spatial int32) []float32

func (*FrameRateCalculatorDD) RecvPacket

func (f *FrameRateCalculatorDD) RecvPacket(ep *ExtPacket) bool

func (*FrameRateCalculatorDD) SetMaxLayer

func (f *FrameRateCalculatorDD) SetMaxLayer(spatial, temporal int32)

type FrameRateCalculatorForDDLayer

type FrameRateCalculatorForDDLayer struct {
	*FrameRateCalculatorDD
	// contains filtered or unexported fields
}

func (*FrameRateCalculatorForDDLayer) GetFrameRate

func (f *FrameRateCalculatorForDDLayer) GetFrameRate() []float32

type FrameRateCalculatorForVP9Layer

type FrameRateCalculatorForVP9Layer struct {
	*FrameRateCalculatorVP9
	// contains filtered or unexported fields
}

func (*FrameRateCalculatorForVP9Layer) GetFrameRate

func (f *FrameRateCalculatorForVP9Layer) GetFrameRate() []float32

type FrameRateCalculatorH26x

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

func NewFrameRateCalculatorH26x

func NewFrameRateCalculatorH26x(clockRate uint32, logger logger.Logger) *FrameRateCalculatorH26x

func (*FrameRateCalculatorH26x) Completed

func (f *FrameRateCalculatorH26x) Completed() bool

func (*FrameRateCalculatorH26x) GetFrameRate

func (f *FrameRateCalculatorH26x) GetFrameRate() []float32

func (*FrameRateCalculatorH26x) RecvPacket

func (f *FrameRateCalculatorH26x) RecvPacket(ep *ExtPacket) bool

type FrameRateCalculatorVP8

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

FrameRateCalculator based on PictureID in VP8

func NewFrameRateCalculatorVP8

func NewFrameRateCalculatorVP8(clockRate uint32, logger logger.Logger) *FrameRateCalculatorVP8

func (FrameRateCalculatorVP8) Completed

func (f FrameRateCalculatorVP8) Completed() bool

func (FrameRateCalculatorVP8) GetFrameRate

func (f FrameRateCalculatorVP8) GetFrameRate() []float32

func (*FrameRateCalculatorVP8) RecvPacket

func (f *FrameRateCalculatorVP8) RecvPacket(ep *ExtPacket) bool

type FrameRateCalculatorVP9

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

FrameRateCalculator based on PictureID in VP9

func NewFrameRateCalculatorVP9

func NewFrameRateCalculatorVP9(clockRate uint32, logger logger.Logger) *FrameRateCalculatorVP9

func (*FrameRateCalculatorVP9) Completed

func (f *FrameRateCalculatorVP9) Completed() bool

func (*FrameRateCalculatorVP9) GetFrameRateCalculatorForSpatial

func (f *FrameRateCalculatorVP9) GetFrameRateCalculatorForSpatial(spatial int32) *FrameRateCalculatorForVP9Layer

func (*FrameRateCalculatorVP9) GetFrameRateForSpatial

func (f *FrameRateCalculatorVP9) GetFrameRateForSpatial(spatial int32) []float32

func (*FrameRateCalculatorVP9) RecvPacket

func (f *FrameRateCalculatorVP9) RecvPacket(ep *ExtPacket) bool

type PacketHistory

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

func NewPacketHistory

func NewPacketHistory(packetCount int) *PacketHistory

func (*PacketHistory) AddPacket

func (ph *PacketHistory) AddPacket(extSeq uint64)

func (*PacketHistory) PacketsConsecutive

func (ph *PacketHistory) PacketsConsecutive(start, end uint64) bool

type RTCPReader

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

func NewRTCPReader

func NewRTCPReader(ssrc uint32) *RTCPReader

func (*RTCPReader) Close

func (r *RTCPReader) Close() error

func (*RTCPReader) OnClose

func (r *RTCPReader) OnClose(fn func())

func (*RTCPReader) OnPacket

func (r *RTCPReader) OnPacket(f func([]byte))

func (*RTCPReader) Read

func (r *RTCPReader) Read(_ []byte) (n int, err error)

func (*RTCPReader) Write

func (r *RTCPReader) Write(p []byte) (n int, err error)

type StreamStatsWithLayers

type StreamStatsWithLayers struct {
	RTPStats *rtpstats.RTPDeltaInfo
	Layers   map[int32]*rtpstats.RTPDeltaInfo

	RTPStatsRemoteView *rtpstats.RTPDeltaInfo
}

type VideoLayer

type VideoLayer struct {
	Spatial  int32
	Temporal int32
}

func (VideoLayer) GreaterThan

func (v VideoLayer) GreaterThan(v2 VideoLayer) bool

func (VideoLayer) IsValid

func (v VideoLayer) IsValid() bool

func (VideoLayer) SpatialGreaterThanOrEqual

func (v VideoLayer) SpatialGreaterThanOrEqual(v2 VideoLayer) bool

func (VideoLayer) String

func (v VideoLayer) String() string

type VideoLayersRid

type VideoLayersRid [DefaultMaxLayerSpatial + 1]string

func NormalizeVideoLayersRid

func NormalizeVideoLayersRid(rids VideoLayersRid) VideoLayersRid

Jump to

Keyboard shortcuts

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