sfu

package
v1.9.1-0...-015e2d1 Latest Latest
Warning

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

Go to latest
Published: Mar 4, 2021 License: MIT Imports: 35 Imported by: 0

Documentation

Index

Constants

View Source
const APIChannelLabel = "ion-sfu"

Variables

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 Candidates

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

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"`
	BufferFactory *buffer.Factory
}

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, out []*webrtc.DataChannel))

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 {
	sync.Mutex
	// 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) 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)

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)

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) 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 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 struct {
	sync.Mutex

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

Peer represents a pair peer connection

func NewPeer

func NewPeer(provider SessionProvider) *Peer

NewPeer creates a new Peer for signaling with the given SFU

func NewPeerWithMetadata

func NewPeerWithMetadata(provider SessionProvider, metadata interface{}) *Peer

NewPeer creates a new Peer for signaling with the given SFU and metadata

func (*Peer) Answer

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

Answer an offer from remote

func (*Peer) Close

func (p *Peer) Close() error

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

func (*Peer) ID

func (p *Peer) ID() string

ID return the peer id

func (*Peer) Join

func (p *Peer) Join(sid, uid string) error

Join initializes this peer for a given sessionID

func (*Peer) Metadata

func (p *Peer) Metadata() interface{}

func (*Peer) Publisher

func (p *Peer) Publisher() *Publisher

func (*Peer) Session

func (p *Peer) Session() *Session

func (*Peer) SetRemoteDescription

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

SetRemoteDescription when receiving an answer from remote

func (*Peer) Subscriber

func (p *Peer) Subscriber() *Subscriber

func (*Peer) Trickle

func (p *Peer) 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(session *Session, id string, 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) SignalingState

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

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)
	AddDownTrack(track *DownTrack, bestQualityFirst bool)
	SubDownTrack(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() map[string]*Session

GetSessions return all sessions

func (*SFU) NewDatachannel

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

type Session

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

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

func NewSession

func NewSession(id string, bf *buffer.Factory, dcs []*Datachannel, cfg WebRTCTransportConfig) *Session

NewSession creates a new session

func (*Session) AddDatachannel

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

func (*Session) AddPeer

func (s *Session) AddPeer(peer *Peer)

AddPublisher adds a transport to the session

func (*Session) BufferFactory

func (s *Session) BufferFactory() *buffer.Factory

BufferFactory returns current session buffer factory

func (*Session) ID

func (s *Session) ID() string

ID return session id

func (*Session) OnClose

func (s *Session) OnClose(f func())

OnClose is called when the session is closed

func (*Session) Peers

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

Transports returns peers in this session

func (*Session) Publish

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

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

func (*Session) RemovePeer

func (s *Session) RemovePeer(pid string)

RemovePeer removes a transport from the session

func (*Session) Subscribe

func (s *Session) Subscribe(peer *Peer)

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

type SessionProvider

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

SessionProvider provides the session 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) GetDownTracks

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

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) 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 {
	ICEPortRange []uint16          `mapstructure:"portrange"`
	ICEServers   []ICEServerConfig `mapstructure:"iceserver"`
	Candidates   Candidates        `mapstructure:"candidates"`
	SDPSemantics string            `mapstructure:"sdpsemantics"`
	MDNS         bool              `mapstructure:"mdns"`
}

WebRTCConfig defines parameters for ice

type WebRTCReceiver

type WebRTCReceiver struct {
	// 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)

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

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

func (*WebRTCReceiver) TrackID

func (w *WebRTCReceiver) TrackID() string

type WebRTCTransportConfig

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

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