Documentation
¶
Index ¶
- Constants
- Variables
- func GenICELinkHeaders(iceServers []webrtc.ICEServer) []string
- func MediamtxSourceTypeToString(s string) (string, error)
- func NoopReader(reader CloneableReader)
- func StartFileCleanup(ctx context.Context, workDir string)
- type CloneableReader
- type ConnQuality
- type EOSReader
- type IncomingTrack
- type MediaMTXClient
- type MediaReader
- type MediaSegmenter
- type MediaState
- type MediaStats
- type MediaWriter
- type MpegtsWriter
- type PeerConnStats
- type RTPSegmenter
- func (s *RTPSegmenter) CloseSegment()
- func (s *RTPSegmenter) IsReady() bool
- func (s *RTPSegmenter) ShouldStartSegment(pts int64, tb uint32) bool
- func (s *RTPSegmenter) StartSegment(startTs int64)
- func (s *RTPSegmenter) WriteAudio(source RTPTrack, pts int64, au [][]byte) error
- func (s *RTPSegmenter) WriteVideo(source RTPTrack, pts, dts int64, au [][]byte) error
- type RTPTrack
- type RingBuffer
- type RingBufferConfig
- type RingBufferReader
- type SegmentHandler
- type SwitchableSegmentReader
- type TimestampCorrector
- type TimestampCorrectorConfig
- type TrackStats
- type TrackType
- type WHIPConnection
- type WHIPPeerConnection
- type WHIPServer
Constants ¶
const ( MediaMTXWebrtcSession = "webrtcsession" MediaMTXRtmpConn = "rtmpconn" )
Variables ¶
var WebrtcConfig = webrtc.Configuration{ ICEServers: []webrtc.ICEServer{ {URLs: []string{"stun:stun.l.google.com:19302"}}, }, }
ICE server configuration. TODO make this configurable
Functions ¶
func GenICELinkHeaders ¶ added in v0.8.4
func MediamtxSourceTypeToString ¶ added in v0.8.2
func NoopReader ¶
func NoopReader(reader CloneableReader)
func StartFileCleanup ¶ added in v0.8.3
StartFileCleanup starts a goroutine to periodically remove any old temporary files accidentally left behind
Types ¶
type CloneableReader ¶ added in v0.8.2
type CloneableReader interface {
io.Reader
Clone() CloneableReader
}
type ConnQuality ¶ added in v0.8.6
type ConnQuality int
const ( ConnQualityGood ConnQuality = iota ConnQualityBad )
func (ConnQuality) MarshalJSON ¶ added in v0.8.6
func (c ConnQuality) MarshalJSON() ([]byte, error)
func (ConnQuality) String ¶ added in v0.8.6
func (c ConnQuality) String() string
type EOSReader ¶
type EOSReader struct{}
func (*EOSReader) Clone ¶ added in v0.8.2
func (r *EOSReader) Clone() CloneableReader
type IncomingTrack ¶ added in v0.8.4
type IncomingTrack struct {
// contains filtered or unexported fields
}
func (*IncomingTrack) ClockRate ¶ added in v0.8.4
func (t *IncomingTrack) ClockRate() int
ClockRate returns the clock rate. Needed by rtptime.GlobalDecoder
func (*IncomingTrack) PTSEqualsDTS ¶ added in v0.8.4
func (*IncomingTrack) PTSEqualsDTS(*rtp.Packet) bool
PTSEqualsDTS returns whether PTS equals DTS. Needed by rtptime.GlobalDecoder TODO handle bframes; look at mediamtx
type MediaMTXClient ¶ added in v0.8.1
type MediaMTXClient struct {
// contains filtered or unexported fields
}
func NewMediaMTXClient ¶ added in v0.8.1
func NewMediaMTXClient(host, apiPassword, sourceID, sourceType string) *MediaMTXClient
func (*MediaMTXClient) KickInputConnection ¶ added in v0.8.1
func (mc *MediaMTXClient) KickInputConnection(ctx context.Context) error
func (*MediaMTXClient) StreamExists ¶ added in v0.8.1
func (mc *MediaMTXClient) StreamExists() (bool, error)
type MediaReader ¶ added in v0.8.2
type MediaReader struct {
// contains filtered or unexported fields
}
func (*MediaReader) Clone ¶ added in v0.8.2
func (mr *MediaReader) Clone() CloneableReader
type MediaSegmenter ¶
type MediaSegmenter struct {
Workdir string
MediaMTXClient *MediaMTXClient
}
func (*MediaSegmenter) RunSegmentation ¶
func (ms *MediaSegmenter) RunSegmentation(ctx context.Context, in string, segmentHandler SegmentHandler)
type MediaState ¶ added in v0.8.4
type MediaState struct {
// contains filtered or unexported fields
}
MediaState manages the lifecycle of a media connection
func NewMediaState ¶ added in v0.8.4
func NewMediaState(pc WHIPPeerConnection) *MediaState
NewMediaState creates a new MediaState with the given peerconnection
func NewMediaStateError ¶ added in v0.8.5
func NewMediaStateError(err error) *MediaState
Returns a mediastate that is already closed with an error
func (*MediaState) AwaitClose ¶ added in v0.8.4
func (m *MediaState) AwaitClose() error
AwaitClose blocks until the connection is closed
func (*MediaState) Close ¶ added in v0.8.4
func (m *MediaState) Close()
Close closes the underlying connection and signals any waiters
func (*MediaState) CloseError ¶ added in v0.8.5
func (m *MediaState) CloseError(err error)
func (*MediaState) IsClosed ¶ added in v0.8.5
func (m *MediaState) IsClosed() bool
func (*MediaState) SetTracks ¶ added in v0.8.5
func (m *MediaState) SetTracks(getter stats.Getter, tracks []RTPTrack)
func (*MediaState) Stats ¶ added in v0.8.5
func (m *MediaState) Stats() (*MediaStats, error)
type MediaStats ¶ added in v0.8.5
type MediaStats struct {
PeerConnStats PeerConnStats `json:"peer_conn_stats"`
TrackStats []TrackStats `json:"track_stats,omitempty"`
ConnQuality ConnQuality `json:"conn_quality"`
}
type MediaWriter ¶ added in v0.8.2
type MediaWriter struct {
// contains filtered or unexported fields
}
func NewMediaWriter ¶ added in v0.8.2
func NewMediaWriter() *MediaWriter
func (*MediaWriter) Close ¶ added in v0.8.2
func (mw *MediaWriter) Close()
func (*MediaWriter) MakeReader ¶ added in v0.8.2
func (mw *MediaWriter) MakeReader() CloneableReader
type MpegtsWriter ¶ added in v0.8.5
type PeerConnStats ¶ added in v0.8.5
type RTPSegmenter ¶ added in v0.8.4
type RTPSegmenter struct {
// contains filtered or unexported fields
}
func NewRTPSegmenter ¶ added in v0.8.4
func NewRTPSegmenter(tracks []RTPTrack, ssr *SwitchableSegmentReader, segDur time.Duration) *RTPSegmenter
func (*RTPSegmenter) CloseSegment ¶ added in v0.8.4
func (s *RTPSegmenter) CloseSegment()
func (*RTPSegmenter) IsReady ¶ added in v0.8.4
func (s *RTPSegmenter) IsReady() bool
func (*RTPSegmenter) ShouldStartSegment ¶ added in v0.8.5
func (s *RTPSegmenter) ShouldStartSegment(pts int64, tb uint32) bool
func (*RTPSegmenter) StartSegment ¶ added in v0.8.4
func (s *RTPSegmenter) StartSegment(startTs int64)
func (*RTPSegmenter) WriteAudio ¶ added in v0.8.4
func (s *RTPSegmenter) WriteAudio(source RTPTrack, pts int64, au [][]byte) error
func (*RTPSegmenter) WriteVideo ¶ added in v0.8.4
func (s *RTPSegmenter) WriteVideo(source RTPTrack, pts, dts int64, au [][]byte) error
type RTPTrack ¶ added in v0.8.4
type RTPTrack interface {
Codec() webrtc.RTPCodecParameters
Kind() webrtc.RTPCodecType
SSRC() webrtc.SSRC
}
type RingBuffer ¶ added in v0.8.6
type RingBuffer struct {
// contains filtered or unexported fields
}
func NewRingBuffer ¶ added in v0.8.6
func NewRingBuffer(config *RingBufferConfig) (*RingBuffer, error)
func (*RingBuffer) Close ¶ added in v0.8.6
func (rb *RingBuffer) Close()
func (*RingBuffer) MakeReader ¶ added in v0.8.6
func (rb *RingBuffer) MakeReader() *RingBufferReader
type RingBufferConfig ¶ added in v0.8.6
type RingBufferConfig struct {
// Ringbuffer size, in bytes
BufferLen int
}
type RingBufferReader ¶ added in v0.8.6
type RingBufferReader struct {
// contains filtered or unexported fields
}
type SegmentHandler ¶
type SegmentHandler func(reader CloneableReader)
type SwitchableSegmentReader ¶
type SwitchableSegmentReader struct {
// contains filtered or unexported fields
}
func NewSwitchableSegmentReader ¶
func NewSwitchableSegmentReader() *SwitchableSegmentReader
func (*SwitchableSegmentReader) Close ¶
func (sr *SwitchableSegmentReader) Close()
func (*SwitchableSegmentReader) Read ¶
func (sr *SwitchableSegmentReader) Read(reader CloneableReader)
func (*SwitchableSegmentReader) SwitchReader ¶
func (sr *SwitchableSegmentReader) SwitchReader(newReader SegmentHandler)
type TimestampCorrector ¶ added in v0.8.6
type TimestampCorrector struct {
// contains filtered or unexported fields
}
TimestampCorrector detects a bug with iOS 18.4.1+ where timestamps come in with microsecond frequency - 1000khz rather than the 90khz that RTP requires If needed, divides incoming timestamps by 90_000 / 1_000_000. https://bugs.webkit.org/show_bug.cgi?id=292273
func NewTimestampCorrector ¶ added in v0.8.6
func NewTimestampCorrector(conf TimestampCorrectorConfig) *TimestampCorrector
NewTimestampCorrector creates a detector based on your target fps.
func (*TimestampCorrector) Process ¶ added in v0.8.6
func (c *TimestampCorrector) Process(ctx context.Context, ts int64) int64
Process inspects the supplied timestamp against wall‐clock arrival time, decides whether the iOS bug is present, and if so converts to 90khz from 1000khz (1000khz == microsecond time base) Returns the (possibly corrected) timestamp.
type TimestampCorrectorConfig ¶ added in v0.8.6
type TimestampCorrectorConfig struct {
// Estimated frame rate.
FPS float64
// Threshold in Hz to trigger correction
ThresholdFreq int
// current user agent to check for inclusion
UserAgent string
// function to obtain current time, injected for testing
Clock func() time.Time
// Kill switch
Disable bool
}
type TrackStats ¶ added in v0.8.5
type TrackType ¶ added in v0.8.5
type TrackType struct {
webrtc.RTPCodecType
}
func (TrackType) MarshalJSON ¶ added in v0.8.5
type WHIPConnection ¶ added in v0.8.4
type WHIPConnection struct {
// contains filtered or unexported fields
}
use this to set peerconnection state when we need it kinda convoluted because the peerconnection gets created async separate from the goroutines where it might be closed from
func NewWHIPConnection ¶ added in v0.8.4
func NewWHIPConnection() *WHIPConnection
func (*WHIPConnection) AwaitClose ¶ added in v0.8.4
func (w *WHIPConnection) AwaitClose() error
func (*WHIPConnection) Close ¶ added in v0.8.4
func (w *WHIPConnection) Close()
func (*WHIPConnection) SetWHIPConnection ¶ added in v0.8.4
func (w *WHIPConnection) SetWHIPConnection(p *MediaState)
func (*WHIPConnection) Stats ¶ added in v0.8.5
func (w *WHIPConnection) Stats() (*MediaStats, error)
type WHIPPeerConnection ¶ added in v0.8.4
type WHIPPeerConnection interface {
io.Closer
GetStats() webrtc.StatsReport
}
type WHIPServer ¶ added in v0.8.4
type WHIPServer struct {
// contains filtered or unexported fields
}
func NewWHIPServer ¶ added in v0.8.4
func NewWHIPServer() *WHIPServer
func (*WHIPServer) CreateWHIP ¶ added in v0.8.4
func (s *WHIPServer) CreateWHIP(ctx context.Context, ssr *SwitchableSegmentReader, whepURL string, w http.ResponseWriter, r *http.Request) *MediaState
handleCreate implements the POST that creates a new resource.