Files
go2rtc/pkg/webrtc/consumer.go
T
2023-03-19 17:17:05 +03:00

74 lines
1.9 KiB
Go

package webrtc
import (
"encoding/json"
"github.com/AlexxIT/go2rtc/pkg/streamer"
"github.com/pion/rtp"
"github.com/pion/webrtc/v3"
)
func (c *Conn) GetMedias() []*streamer.Media {
return c.medias
}
func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer.Track {
switch c.Mode {
case streamer.ModePassiveConsumer:
switch track.Direction {
case streamer.DirectionSendonly:
// send our track to WebRTC consumer
return c.addSendTrack(media, track)
case streamer.DirectionRecvonly:
// receive track from WebRTC consumer (microphone, backchannel, two way audio)
return c.addConsumerRecvTrack(media, track)
}
case streamer.ModePassiveProducer:
// "Stream to camera" function
consCodec := media.MatchCodec(track.Codec)
consTrack := c.GetTrack(media, consCodec)
if consTrack == nil {
return nil
}
return track.Bind(func(packet *rtp.Packet) error {
return consTrack.WriteRTP(packet)
})
}
panic("not implemented")
}
func (c *Conn) addConsumerRecvTrack(media *streamer.Media, track *streamer.Track) *streamer.Track {
params := webrtc.RTPCodecParameters{
RTPCodecCapability: webrtc.RTPCodecCapability{
MimeType: MimeType(track.Codec),
ClockRate: track.Codec.ClockRate,
Channels: track.Codec.Channels,
},
PayloadType: 0, // don't know if this necessary
}
tr := c.getTranseiver(media.MID)
// set codec for consumer recv track so remote peer should send media with this codec
_ = tr.SetCodecPreferences([]webrtc.RTPCodecParameters{params})
c.tracks = append(c.tracks, track)
return track
}
func (c *Conn) MarshalJSON() ([]byte, error) {
info := &streamer.Info{
Type: c.Desc + " " + c.Mode.String(),
RemoteAddr: c.remote,
UserAgent: c.UserAgent,
Medias: c.medias,
Tracks: c.tracks,
Recv: uint32(c.receive),
Send: uint32(c.send),
}
return json.Marshal(info)
}