Files
go2rtc/pkg/webrtc/client.go
T
2023-03-19 17:14:59 +03:00

70 lines
1.7 KiB
Go

package webrtc
import (
"github.com/AlexxIT/go2rtc/pkg/streamer"
"github.com/pion/sdp/v3"
"github.com/pion/webrtc/v3"
)
func (c *Conn) CreateOffer(medias []*streamer.Media) (string, error) {
for _, media := range medias {
if _, err := c.pc.AddTransceiverFromKind(
webrtc.NewRTPCodecType(media.Kind), webrtc.RTPTransceiverInit{
Direction: webrtc.NewRTPTransceiverDirection(media.Direction),
},
); err != nil {
return "", err
}
}
desc, err := c.pc.CreateOffer(nil)
if err != nil {
return "", err
}
if err = c.pc.SetLocalDescription(desc); err != nil {
return "", err
}
return c.pc.LocalDescription().SDP, nil
}
func (c *Conn) CreateCompleteOffer(medias []*streamer.Media) (string, error) {
if _, err := c.CreateOffer(medias); err != nil {
return "", err
}
<-webrtc.GatheringCompletePromise(c.pc)
return c.pc.LocalDescription().SDP, nil
}
func (c *Conn) SetAnswer(answer string) (err error) {
desc := webrtc.SessionDescription{SDP: answer, Type: webrtc.SDPTypeAnswer}
if err = c.pc.SetRemoteDescription(desc); err != nil {
return
}
sd := &sdp.SessionDescription{}
if err = sd.Unmarshal([]byte(answer)); err != nil {
return
}
medias := streamer.UnmarshalMedias(sd.MediaDescriptions)
// sort medias, so video will always be before audio
// and ignore application media from Hass default lovelace card
// ignore media without direction (inactive media)
for _, media := range medias {
if media.Kind == streamer.KindVideo && media.Direction != "" {
c.medias = append(c.medias, media)
}
}
for _, media := range medias {
if media.Kind == streamer.KindAudio && media.Direction != "" {
c.medias = append(c.medias, media)
}
}
return nil
}