sfu

package
v1.6.4 Latest Latest
Warning

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

Go to latest
Published: Dec 11, 2020 License: MIT Imports: 23 Imported by: 37

Documentation

Index

Constants

This section is empty.

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

Functions

This section is empty.

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"`
	} `mapstructure:"sfu"`
	WebRTC WebRTCConfig `mapstructure:"webrtc"`
	Log    log.Config   `mapstructure:"log"`
	Router RouterConfig `mapstructure:"router"`
}

Config for base SFU

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, peerID string) (*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) 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) 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 int)

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

func (d *DownTrack) WriteRTP(p *rtp.Packet) 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
	SVCDownTrack
)

type ICEServerConfig

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

ICEServerConfig defines parameters for ice servers

type NACK

type NACK struct {
	SN  uint16
	LRX int64
}

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 (*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) Join

func (p *Peer) Join(sid string, sdp webrtc.SessionDescription) (*webrtc.SessionDescription, error)

Join initializes this peer for a given sessionID (takes an SDPOffer)

func (*Peer) SetRemoteDescription

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

SetRemoteDescription when receiving an answer from remote

func (*Peer) Trickle

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

Trickle candidates available for this peer

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)
	AddDownTrack(track *DownTrack, bestQualityFirst bool)
	SubDownTrack(track *DownTrack, layer int) 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 {
	MaxBandwidth  uint64          `mapstructure:"maxbandwidth"`
	MaxBufferTime int             `mapstructure:"maxbuffertime"`
	Simulcast     SimulcastConfig `mapstructure:"simulcast"`
}

RouterConfig defines router configurations

type SFU

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

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) *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) OnClose

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

OnClose is called when the session is closed

func (*Session) Peers

func (s *Session) Peers() map[string]*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) 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) 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) SetRemoteDescription

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

SetRemoteDescription sets the SessionDescription of the remote peer

type VP8Helper

type VP8Helper struct {
	TemporalSupported bool
	// Optional Header
	PictureID uint16 /* 8 or 16 bits, picture ID */

	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.
	TID uint8 /* 2 bits temporal layer idx*/
	// IsKeyFrame is a helper to detect if current packet is a keyframe
	IsKeyFrame bool
	// contains filtered or unexported fields
}

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

VP8Helper 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 (*VP8Helper) Unmarshal

func (p *VP8Helper) Unmarshal(payload []byte) error

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

type WebRTCConfig

type WebRTCConfig struct {
	ICEPortRange []uint16          `mapstructure:"portrange"`
	ICEServers   []ICEServerConfig `mapstructure:"iceserver"`
	Candidates   Candidates        `mapstructure:"candidates"`
	SDPSemantics string            `mapstructure:"sdpsemantics"`
}

WebRTCConfig defines parameters for ice

type WebRTCReceiver

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

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