buffer

package
v0.0.0-...-5f592e6 Latest Latest
Warning

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

Go to latest
Published: Mar 22, 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 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 IsAV1KeyFrame

func IsAV1KeyFrame(payload []byte) bool

IsAV1KeyFrame detects if av1 payload is a keyframe taken from https://github.com/jech/galene/blob/master/codecs/codecs.go all credits belongs to Juliusz Chroboczek @jech and the awesome Galene SFU

func IsH264KeyFrame

func IsH264KeyFrame(payload []byte) bool

IsH264KeyFrame detects if h264 payload is a keyframe this code was taken from https://github.com/jech/galene/blob/codecs/rtpconn/rtpreader.go#L45 all credits belongs to Juliusz Chroboczek @jech and the awesome Galene SFU

func IsH265KeyFrame

func IsH265KeyFrame(payload []byte) (kf bool)

func IsVP9KeyFrame

func IsVP9KeyFrame(vp9 *codecs.VP9Packet, payload []byte) bool

IsVP9KeyFrame detects if vp9 payload is a keyframe taken from https://github.com/jech/galene/blob/master/codecs/codecs.go all credits belongs to Juliusz Chroboczek @jech and the awesome Galene SFU

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 VPxPictureIdSizeDiff

func VPxPictureIdSizeDiff(mBit1 bool, mBit2 bool) int

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 BitReader

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

-------- BitReader --------

func NewBitReader

func NewBitReader(data []byte) *BitReader

func (*BitReader) ReadBits

func (br *BitReader) ReadBits(n int) (uint, error)

func (*BitReader) ReadFlag

func (br *BitReader) ReadFlag() (bool, error)

func (*BitReader) ReadSE

func (br *BitReader) ReadSE() (int, error)

func (*BitReader) ReadUE

func (br *BitReader) ReadUE() (uint, error)

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([]VideoSize))

func (*BufferBase) ReadExtended

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

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([]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 SPSInfo

type SPSInfo struct {
	ChromaFormatIDC             uint
	PicWidthInLumaSamples       uint
	PicHeightInLumaSamples      uint
	ConformanceWindowFlag       bool
	ConfWinLeftOffset           uint
	ConfWinRightOffset          uint
	ConfWinTopOffset            uint
	ConfWinBottomOffset         uint
	CodedWidth, CodedHeight     uint // Raw coded resolution
	DisplayWidth, DisplayHeight uint // Resolution after conformance window cropping
}

SPSInfo holds parsed SPS parameters

type StreamStatsWithLayers

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

	RTPStatsRemoteView *rtpstats.RTPDeltaInfo
}

type VP8

type VP8 struct {
	FirstByte byte
	S         bool

	I         bool
	M         bool
	PictureID uint16 /* 7 or 15 bits, picture ID */

	L         bool
	TL0PICIDX uint8 /* 8 bits temporal level zero index */

	// Optional Header If either of the T or K bits are set to 1,
	// the TID/Y/KEYIDX extension field MUST be present.
	T   bool
	TID uint8 /* 2 bits temporal layer idx */
	Y   bool

	K      bool
	KEYIDX uint8 /* 5 bits of key frame idx */

	HeaderSize int

	// IsKeyFrame is a helper to detect if current packet is a keyframe
	IsKeyFrame bool
}

VP8 is a helper to get temporal data from VP8 packet header

VP8 Payload Descriptor
		0 1 2 3 4 5 6 7                      0 1 2 3 4 5 6 7
		+-+-+-+-+-+-+-+-+                   +-+-+-+-+-+-+-+-+
		|X|R|N|S|R| PID | (REQUIRED)        |X|R|N|S|R| PID | (REQUIRED)
		+-+-+-+-+-+-+-+-+                   +-+-+-+-+-+-+-+-+
	X:  |I|L|T|K| RSV   | (OPTIONAL)   X:   |I|L|T|K| RSV   | (OPTIONAL)
		+-+-+-+-+-+-+-+-+                   +-+-+-+-+-+-+-+-+
	I:  |M| PictureID   | (OPTIONAL)   I:   |M| PictureID   | (OPTIONAL)
		+-+-+-+-+-+-+-+-+                   +-+-+-+-+-+-+-+-+
	L:  |   TL0PICIDX   | (OPTIONAL)        |   PictureID   |
		+-+-+-+-+-+-+-+-+                   +-+-+-+-+-+-+-+-+
	T/K:|TID|Y| KEYIDX  | (OPTIONAL)   L:   |   TL0PICIDX   | (OPTIONAL)
		+-+-+-+-+-+-+-+-+                   +-+-+-+-+-+-+-+-+
	T/K:|TID|Y| KEYIDX  | (OPTIONAL)
		+-+-+-+-+-+-+-+-+

func (*VP8) Marshal

func (v *VP8) Marshal() ([]byte, error)

func (*VP8) MarshalTo

func (v *VP8) MarshalTo(buf []byte) (int, error)

func (*VP8) Unmarshal

func (v *VP8) Unmarshal(payload []byte) error

Unmarshal parses the passed byte slice and stores the result in the VP8 this method is called upon

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

type VideoSize

type VideoSize struct {
	Width  uint32
	Height uint32
}

VideoSize represents video resolution

func ExtractDependencyDescriptorVideoSize

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

func ExtractH264VideoSize

func ExtractH264VideoSize(payload []byte) VideoSize

ExtractH264VideoSize extracts resolution from H.264 RTP payload

func ExtractH265VideoSize

func ExtractH265VideoSize(payload []byte) VideoSize

func ExtractVP8VideoSize

func ExtractVP8VideoSize(vp8Packet *VP8, payload []byte) VideoSize

ExtractVP8VideoSize extracts video resolution from VP8 key frame

Jump to

Keyboard shortcuts

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