74 lines
1.9 KiB
Go
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)
|
|
}
|