sfu

package
v1.10.8 Latest Latest
Warning

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

Go to latest
Published: Jul 18, 2021 License: MIT Imports: 37 Imported by: 0

Documentation

Index

Constants

View Source
const APIChannelLabel = "ion-sfu"
View Source
const (
	AudioLevelsMethod = "audioLevels"
)

Variables

View Source
var (
	ErrSpatialNotSupported = errors.New("current track does not support simulcast/SVC")
	ErrSpatialLayerBusy    = errors.New("a spatial layer change is in progress, try latter")
)
View Source
var (
	// ErrTransportExists join is called after a peerconnection is established
	ErrTransportExists = errors.New("rtc transport already exists for this connection")
	// ErrNoTransportEstablished cannot signal before join
	ErrNoTransportEstablished = errors.New("no rtc transport exists for this Peer")
	// ErrOfferIgnored if offer received in unstable state
	ErrOfferIgnored = errors.New("offered ignored")
)

Logger is an implementation of logr.Logger. If is not provided - will be turned off.

Functions

func InitTurnServer

func InitTurnServer(conf TurnConfig, auth func(username, realm string, srcAddr net.Addr) ([]byte, bool)) (*turn.Server, error)

Types

type AudioObserver

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

func NewAudioObserver

func NewAudioObserver(threshold uint8, interval, filter int) *AudioObserver

func (*AudioObserver) Calc

func (a *AudioObserver) Calc() []string

type Candidates

type Candidates struct {
	IceLite    bool     `mapstructure:"icelite"`
	NAT1To1IPs []string `mapstructure:"nat1to1"`
}

type ChannelAPIMessage

type ChannelAPIMessage struct {
	Method string      `json:"method"`
	Params interface{} `json:"params,omitempty"`
}

type Config

type Config struct {
	SFU struct {
		Ballast   int64 `mapstructure:"ballast"`
		WithStats bool  `mapstructure:"withstats"`
	} `mapstructure:"sfu"`
	WebRTC        WebRTCConfig `mapstructure:"webrtc"`
	Router        RouterConfig `mapstructure:"Router"`
	Turn          TurnConfig   `mapstructure:"turn"`
	Relay         func(meta relay.PeerMeta, signal []byte) ([]byte, error)
	BufferFactory *buffer.Factory
	TurnAuth      func(username string, realm string, srcAddr net.Addr) ([]byte, bool)
}

Config for base SFU

type Datachannel

type Datachannel struct {
	Label string
	// contains filtered or unexported fields
}

Datachannel is a wrapper to define middlewares executed on defined label. The datachannels created will be negotiated on join to all peers that joins the SFU.

func (*Datachannel) OnMessage

func (dc *Datachannel) OnMessage(fn func(ctx context.Context, args ProcessArgs))

OnMessage sets the message callback for the datachannel, the event is fired after all the middlewares have processed the message.

func (*Datachannel) Use

func (dc *Datachannel) Use(middlewares ...func(MessageProcessor) MessageProcessor)

Use adds the middlewares to the current Datachannel. The middlewares are going to be executed before the OnMessage event fires.

type DownTrack

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

DownTrack implements TrackLocal, is the track used to write packets to SFU Subscriber, the track handle the packets for simple, simulcast and SVC Publisher.

func NewDownTrack

func NewDownTrack(c webrtc.RTPCodecCapability, r Receiver, bf *buffer.Factory, peerID string, mt int) (*DownTrack, error)

NewDownTrack returns a DownTrack.

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 setups all the state (SSRC and PayloadType) to have a call

func (*DownTrack) Close

func (d *DownTrack) Close()

Close track

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

func (d *DownTrack) CurrentSpatialLayer() int

func (*DownTrack) ID

func (d *DownTrack) ID() string

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

func (*DownTrack) Kind

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

Kind controls if this TrackLocal is audio or video

func (*DownTrack) Mute

func (d *DownTrack) Mute(val bool)

Mute enables or disables media forwarding

func (*DownTrack) OnBind

func (d *DownTrack) OnBind(fn func())

func (*DownTrack) OnCloseHandler

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

OnCloseHandler method to be called on remote tracked removed

func (*DownTrack) SetInitialLayers

func (d *DownTrack) SetInitialLayers(spatialLayer, temporalLayer int64)

func (*DownTrack) SetTransceiver

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

func (*DownTrack) StreamID

func (d *DownTrack) StreamID() string

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

func (*DownTrack) SwitchSpatialLayer

func (d *DownTrack) SwitchSpatialLayer(targetLayer int64, setAsMax bool) error

func (*DownTrack) SwitchSpatialLayerDone

func (d *DownTrack) SwitchSpatialLayerDone()

func (*DownTrack) SwitchTemporalLayer

func (d *DownTrack) SwitchTemporalLayer(targetLayer int64, setAsMax bool)

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

func (d *DownTrack) UpdateStats(packetLen uint32)

func (*DownTrack) UptrackLayersChange

func (d *DownTrack) UptrackLayersChange(availableLayers []uint16) (int64, error)

func (*DownTrack) WriteRTP

func (d *DownTrack) WriteRTP(p *buffer.ExtPacket) error

WriteRTP writes a RTP Packet to the DownTrack

type DownTrackType

type DownTrackType int

DownTrackType determines the type of a track

const (
	SimpleDownTrack DownTrackType = iota + 1
	SimulcastDownTrack
)

type ICEServerConfig

type ICEServerConfig struct {
	URLs       []string `mapstructure:"urls"`
	Username   string   `mapstructure:"username"`
	Credential string   `mapstructure:"credential"`
}

ICEServerConfig defines parameters for ice servers

type JoinConfig

type JoinConfig struct {
	// If true the peer will not be allowed to publish tracks to SessionLocal.
	NoPublish bool
	// If true the peer will not be allowed to subscribe to other peers in SessionLocal.
	NoSubscribe bool
}

JoinConfig allow adding more control to the peers joining a SessionLocal.

type MessageProcessor

type MessageProcessor interface {
	Process(ctx context.Context, args ProcessArgs)
}

type Middlewares

type Middlewares []func(MessageProcessor) MessageProcessor

func (Middlewares) Process

func (Middlewares) ProcessFunc

func (mws Middlewares) ProcessFunc(h MessageProcessor) MessageProcessor

type Peer

type Peer interface {
	ID() string
	Session() Session
	Publisher() *Publisher
	Subscriber() *Subscriber
	Close() error
	SendDCMessage(label string, msg []byte) error
}

type PeerLocal

type PeerLocal struct {
	sync.Mutex

	OnOffer                    func(*webrtc.SessionDescription)
	OnIceCandidate             func(*webrtc.ICECandidateInit, int)
	OnICEConnectionStateChange func(webrtc.ICEConnectionState)
	// contains filtered or unexported fields
}

PeerLocal represents a pair peer connection

func NewPeer

func NewPeer(provider SessionProvider) *PeerLocal

NewPeer creates a new PeerLocal for signaling with the given SFU

func (*PeerLocal) Answer

func (p *PeerLocal) Answer(sdp webrtc.SessionDescription) (*webrtc.SessionDescription, error)

Answer an offer from remote

func (*PeerLocal) Close

func (p *PeerLocal) Close() error

Close shuts down the peer connection and sends true to the done channel

func (*PeerLocal) ID

func (p *PeerLocal) ID() string

ID return the peer id

func (*PeerLocal) Join

func (p *PeerLocal) Join(sid, uid string, config ...JoinConfig) error

Join initializes this peer for a given sessionID

func (*PeerLocal) Publisher

func (p *PeerLocal) Publisher() *Publisher

func (*PeerLocal) SendDCMessage

func (p *PeerLocal) SendDCMessage(label string, msg []byte) error

func (*PeerLocal) Session

func (p *PeerLocal) Session() Session

func (*PeerLocal) SetRemoteDescription

func (p *PeerLocal) SetRemoteDescription(sdp webrtc.SessionDescription) error

SetRemoteDescription when receiving an answer from remote

func (*PeerLocal) Subscriber

func (p *PeerLocal) Subscriber() *Subscriber

func (*PeerLocal) Trickle

func (p *PeerLocal) Trickle(candidate webrtc.ICECandidateInit, target int) error

Trickle candidates available for this peer

type ProcessArgs

type ProcessArgs struct {
	Peer        Peer
	Message     webrtc.DataChannelMessage
	DataChannel *webrtc.DataChannel
}

type ProcessFunc

type ProcessFunc func(ctx context.Context, args ProcessArgs)

func (ProcessFunc) Process

func (p ProcessFunc) Process(ctx context.Context, args ProcessArgs)

type Publisher

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

func NewPublisher

func NewPublisher(id string, session Session, cfg *WebRTCTransportConfig) (*Publisher, error)

NewPublisher creates a new Publisher

func (*Publisher) AddICECandidate

func (p *Publisher) AddICECandidate(candidate webrtc.ICECandidateInit) error

AddICECandidate to peer connection

func (*Publisher) Answer

func (p *Publisher) Answer(offer webrtc.SessionDescription) (webrtc.SessionDescription, error)

func (*Publisher) Close

func (p *Publisher) Close()

Close peer

func (*Publisher) GetRouter

func (p *Publisher) GetRouter() Router

GetRouter returns Router with mediaSSRC

func (*Publisher) OnICECandidate

func (p *Publisher) OnICECandidate(f func(c *webrtc.ICECandidate))

OnICECandidate handler

func (*Publisher) OnICEConnectionStateChange

func (p *Publisher) OnICEConnectionStateChange(f func(connectionState webrtc.ICEConnectionState))

func (*Publisher) PeerConnection

func (p *Publisher) PeerConnection() *webrtc.PeerConnection

func (*Publisher) Relay

func (p *Publisher) Relay(ice []webrtc.ICEServer) (*relay.Peer, error)

func (*Publisher) SignalingState

func (p *Publisher) SignalingState() webrtc.SignalingState

func (*Publisher) Tracks

func (p *Publisher) Tracks() []*webrtc.TrackRemote

type Receiver

type Receiver interface {
	TrackID() string
	StreamID() string
	Codec() webrtc.RTPCodecParameters
	Kind() webrtc.RTPCodecType
	SSRC(layer int) uint32
	AddUpTrack(track *webrtc.TrackRemote, buffer *buffer.Buffer, bestQualityFirst bool)
	AddDownTrack(track *DownTrack, bestQualityFirst bool)
	SwitchDownTrack(track *DownTrack, layer int) error
	GetBitrate() [3]uint64
	GetMaxTemporalLayer() [3]int64
	RetransmitPackets(track *DownTrack, packets []packetMeta) error
	DeleteDownTrack(layer int, id string)
	OnCloseHandler(fn func())
	SendRTCP(p []rtcp.Packet)
	SetRTCPCh(ch chan []rtcp.Packet)
}

Receiver defines a interface for a track receivers

func NewWebRTCReceiver

func NewWebRTCReceiver(receiver *webrtc.RTPReceiver, track *webrtc.TrackRemote, pid string) Receiver

NewWebRTCReceiver creates a new webrtc track receivers

type Router

type Router interface {
	ID() string
	AddReceiver(receiver *webrtc.RTPReceiver, track *webrtc.TrackRemote) (Receiver, bool)
	AddDownTracks(s *Subscriber, r Receiver) error
	Stop()
}

Router defines a track rtp/rtcp Router

type RouterConfig

type RouterConfig struct {
	WithStats           bool            `mapstructure:"withstats"`
	MaxBandwidth        uint64          `mapstructure:"maxbandwidth"`
	MaxPacketTrack      int             `mapstructure:"maxpackettrack"`
	AudioLevelInterval  int             `mapstructure:"audiolevelinterval"`
	AudioLevelThreshold uint8           `mapstructure:"audiolevelthreshold"`
	AudioLevelFilter    int             `mapstructure:"audiolevelfilter"`
	Simulcast           SimulcastConfig `mapstructure:"simulcast"`
}

RouterConfig defines Router configurations

type SFU

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

SFU represents an sfu instance

func NewSFU

func NewSFU(c Config) *SFU

NewSFU creates a new sfu instance

func (*SFU) GetSession

func (s *SFU) GetSession(sid string) (Session, WebRTCTransportConfig)

func (*SFU) GetSessions

func (s *SFU) GetSessions() []Session

GetSessions return all sessions

func (*SFU) NewDatachannel

func (s *SFU) NewDatachannel(label string) *Datachannel

type Session

type Session interface {
	ID() string
	Publish(router Router, r Receiver)
	Subscribe(peer Peer)
	AddPeer(peer Peer)
	RemovePeer(peer Peer)
	AudioObserver() *AudioObserver
	AddDatachannel(owner string, dc *webrtc.DataChannel)
	GetDCMiddlewares() []*Datachannel
	GetDataChannelLabels() []string
	GetDataChannels(origin, label string) (dcs []*webrtc.DataChannel)
	Peers() []Peer
}

Session represents a set of peers. Transports inside a SessionLocal are automatically subscribed to each other.

func NewSession

func NewSession(id string, dcs []*Datachannel, cfg WebRTCTransportConfig) Session

NewSession creates a new SessionLocal

type SessionLocal

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

func (*SessionLocal) AddDatachannel

func (s *SessionLocal) AddDatachannel(owner string, dc *webrtc.DataChannel)

func (*SessionLocal) AddPeer

func (s *SessionLocal) AddPeer(peer Peer)

func (*SessionLocal) AudioObserver

func (s *SessionLocal) AudioObserver() *AudioObserver

func (*SessionLocal) Close

func (s *SessionLocal) Close()

func (*SessionLocal) GetDCMiddlewares

func (s *SessionLocal) GetDCMiddlewares() []*Datachannel

func (*SessionLocal) GetDataChannelLabels

func (s *SessionLocal) GetDataChannelLabels() []string

func (*SessionLocal) GetDataChannels

func (s *SessionLocal) GetDataChannels(origin, label string) []*webrtc.DataChannel

func (*SessionLocal) ID

func (s *SessionLocal) ID() string

ID return SessionLocal id

func (*SessionLocal) OnClose

func (s *SessionLocal) OnClose(f func())

OnClose is called when the SessionLocal is closed

func (*SessionLocal) Peers

func (s *SessionLocal) Peers() []Peer

Peers returns peers in this SessionLocal

func (*SessionLocal) Publish

func (s *SessionLocal) Publish(router Router, r Receiver)

Publish will add a Sender to all peers in current SessionLocal from given Receiver

func (*SessionLocal) RemovePeer

func (s *SessionLocal) RemovePeer(p Peer)

RemovePeer removes a transport from the SessionLocal

func (*SessionLocal) Subscribe

func (s *SessionLocal) Subscribe(peer Peer)

Subscribe will create a Sender for every other Receiver in the SessionLocal

type SessionProvider

type SessionProvider interface {
	GetSession(sid string) (Session, WebRTCTransportConfig)
}

SessionProvider provides the SessionLocal to the sfu.Peer This allows the sfu.SFU{} implementation to be customized / wrapped by another package

type SimulcastConfig

type SimulcastConfig struct {
	BestQualityFirst    bool `mapstructure:"bestqualityfirst"`
	EnableTemporalLayer bool `mapstructure:"enabletemporallayer"`
}

type Subscriber

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

func NewSubscriber

func NewSubscriber(id string, cfg WebRTCTransportConfig) (*Subscriber, error)

NewSubscriber creates a new Subscriber

func (*Subscriber) AddDataChannel

func (s *Subscriber) AddDataChannel(label string) (*webrtc.DataChannel, error)

func (*Subscriber) AddDatachannel

func (s *Subscriber) AddDatachannel(peer Peer, dc *Datachannel) error

func (*Subscriber) AddDownTrack

func (s *Subscriber) AddDownTrack(streamID string, downTrack *DownTrack)

func (*Subscriber) AddICECandidate

func (s *Subscriber) AddICECandidate(candidate webrtc.ICECandidateInit) error

AddICECandidate to peer connection

func (*Subscriber) Close

func (s *Subscriber) Close() error

Close peer

func (*Subscriber) CreateOffer

func (s *Subscriber) CreateOffer() (webrtc.SessionDescription, error)

func (*Subscriber) DataChannel

func (s *Subscriber) DataChannel(label string) *webrtc.DataChannel

DataChannel returns the channel for a label

func (*Subscriber) GetDatachannel

func (s *Subscriber) GetDatachannel(label string) *webrtc.DataChannel

func (*Subscriber) GetDownTracks

func (s *Subscriber) GetDownTracks(streamID string) []*DownTrack

func (*Subscriber) Negotiate

func (s *Subscriber) Negotiate()

Negotiate fires a debounced negotiation request

func (*Subscriber) OnICECandidate

func (s *Subscriber) OnICECandidate(f func(c *webrtc.ICECandidate))

OnICECandidate handler

func (*Subscriber) OnNegotiationNeeded

func (s *Subscriber) OnNegotiationNeeded(f func())

func (*Subscriber) RegisterDatachannel

func (s *Subscriber) RegisterDatachannel(label string, dc *webrtc.DataChannel)

func (*Subscriber) RemoveDownTrack

func (s *Subscriber) RemoveDownTrack(streamID string, downTrack *DownTrack)

func (*Subscriber) SetRemoteDescription

func (s *Subscriber) SetRemoteDescription(desc webrtc.SessionDescription) error

SetRemoteDescription sets the SessionDescription of the remote peer

type TurnAuth

type TurnAuth struct {
	Credentials string `mapstructure:"credentials"`
	Secret      string `mapstructure:"secret"`
}

type TurnConfig

type TurnConfig struct {
	Enabled   bool     `mapstructure:"enabled"`
	Realm     string   `mapstructure:"realm"`
	Address   string   `mapstructure:"address"`
	Cert      string   `mapstructure:"cert"`
	Key       string   `mapstructure:"key"`
	Auth      TurnAuth `mapstructure:"auth"`
	PortRange []uint16 `mapstructure:"portrange"`
}

WebRTCConfig defines parameters for ice

type WebRTCConfig

type WebRTCConfig struct {
	ICESinglePort int                  `mapstructure:"singleport"`
	ICEPortRange  []uint16             `mapstructure:"portrange"`
	ICEServers    []ICEServerConfig    `mapstructure:"iceserver"`
	Candidates    Candidates           `mapstructure:"candidates"`
	SDPSemantics  string               `mapstructure:"sdpsemantics"`
	MDNS          bool                 `mapstructure:"mdns"`
	Timeouts      WebRTCTimeoutsConfig `mapstructure:"timeouts"`
}

WebRTCConfig defines parameters for ice

type WebRTCReceiver

type WebRTCReceiver struct {
	sync.Mutex
	// contains filtered or unexported fields
}

WebRTCReceiver receives a video track

func (*WebRTCReceiver) AddDownTrack

func (w *WebRTCReceiver) AddDownTrack(track *DownTrack, bestQualityFirst bool)

func (*WebRTCReceiver) AddUpTrack

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

func (*WebRTCReceiver) Codec

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

func (*WebRTCReceiver) DeleteDownTrack

func (w *WebRTCReceiver) DeleteDownTrack(layer int, id string)

DeleteDownTrack removes a DownTrack from a Receiver

func (*WebRTCReceiver) GetBitrate

func (w *WebRTCReceiver) GetBitrate() [3]uint64

func (*WebRTCReceiver) GetMaxTemporalLayer

func (w *WebRTCReceiver) GetMaxTemporalLayer() [3]int64

func (*WebRTCReceiver) Kind

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

func (*WebRTCReceiver) OnCloseHandler

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

OnCloseHandler method to be called on remote tracked removed

func (*WebRTCReceiver) RetransmitPackets

func (w *WebRTCReceiver) RetransmitPackets(track *DownTrack, packets []packetMeta) error

func (*WebRTCReceiver) SSRC

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

func (*WebRTCReceiver) SendRTCP

func (w *WebRTCReceiver) SendRTCP(p []rtcp.Packet)

func (*WebRTCReceiver) SetRTCPCh

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

func (*WebRTCReceiver) StreamID

func (w *WebRTCReceiver) StreamID() string

func (*WebRTCReceiver) SwitchDownTrack

func (w *WebRTCReceiver) SwitchDownTrack(track *DownTrack, layer int) error

func (*WebRTCReceiver) TrackID

func (w *WebRTCReceiver) TrackID() string

type WebRTCTimeoutsConfig

type WebRTCTimeoutsConfig struct {
	ICEDisconnectedTimeout int `mapstructure:"disconnected"`
	ICEFailedTimeout       int `mapstructure:"failed"`
	ICEKeepaliveInterval   int `mapstructure:"keepalive"`
}

type WebRTCTransportConfig

type WebRTCTransportConfig struct {
	Configuration webrtc.Configuration
	Setting       webrtc.SettingEngine
	Router        RouterConfig
	Relay         func(meta relay.PeerMeta, signal []byte) ([]byte, error)
	BufferFactory *buffer.Factory
}

WebRTCTransportConfig represents Configuration options

func NewWebRTCTransportConfig

func NewWebRTCTransportConfig(c Config) WebRTCTransportConfig

NewWebRTCTransportConfig parses our settings and returns a usable WebRTCTransportConfig for creating PeerConnections

Jump to

Keyboard shortcuts

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