mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-09-26 20:31:11 +08:00
84 lines
1.6 KiB
Go
84 lines
1.6 KiB
Go
package webrtc
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/pion/rtp"
|
|
"github.com/pion/webrtc/v4"
|
|
)
|
|
|
|
type Track struct {
|
|
kind string
|
|
id string
|
|
streamID string
|
|
sequence uint16
|
|
ssrc uint32
|
|
writer webrtc.TrackLocalWriter
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func NewTrack(kind string) *Track {
|
|
return &Track{
|
|
kind: kind,
|
|
id: "go2rtc-" + kind,
|
|
streamID: "go2rtc",
|
|
}
|
|
}
|
|
|
|
func (t *Track) Bind(context webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error) {
|
|
t.mu.Lock()
|
|
t.ssrc = uint32(context.SSRC())
|
|
t.writer = context.WriteStream()
|
|
t.mu.Unlock()
|
|
|
|
for _, parameters := range context.CodecParameters() {
|
|
// return first parameters
|
|
return parameters, nil
|
|
}
|
|
|
|
return webrtc.RTPCodecParameters{}, nil
|
|
}
|
|
|
|
func (t *Track) Unbind(context webrtc.TrackLocalContext) error {
|
|
t.mu.Lock()
|
|
t.writer = nil
|
|
t.mu.Unlock()
|
|
return nil
|
|
}
|
|
|
|
func (t *Track) ID() string {
|
|
return t.id
|
|
}
|
|
|
|
func (t *Track) RID() string {
|
|
return "" // don't know what it is
|
|
}
|
|
|
|
func (t *Track) StreamID() string {
|
|
return t.streamID
|
|
}
|
|
|
|
func (t *Track) Kind() webrtc.RTPCodecType {
|
|
return webrtc.NewRTPCodecType(t.kind)
|
|
}
|
|
|
|
func (t *Track) WriteRTP(payloadType uint8, packet *rtp.Packet) (err error) {
|
|
// using mutex because Unbind https://github.com/AlexxIT/go2rtc/issues/994
|
|
t.mu.Lock()
|
|
|
|
// in case when we start WriteRTP before Track.Bind
|
|
if t.writer != nil {
|
|
// important to have internal counter if input packets from different sources
|
|
t.sequence++
|
|
|
|
header := packet.Header
|
|
header.SSRC = t.ssrc
|
|
header.PayloadType = payloadType
|
|
header.SequenceNumber = t.sequence
|
|
_, err = t.writer.WriteRTP(&header, packet.Payload)
|
|
}
|
|
|
|
t.mu.Unlock()
|
|
return
|
|
}
|