From 7cdf97c91ae40183ab1387e7a8b655e4a00da96d Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Thu, 18 Aug 2022 22:46:43 +0300 Subject: [PATCH] Adds ExchangeSDP function to webrtc module --- cmd/webrtc/webrtc.go | 49 ++++++++++++++++++++++++++++++++++++++++++++ pkg/webrtc/conn.go | 9 ++++++++ 2 files changed, 58 insertions(+) diff --git a/cmd/webrtc/webrtc.go b/cmd/webrtc/webrtc.go index 9c54da48..a8780c7e 100644 --- a/cmd/webrtc/webrtc.go +++ b/cmd/webrtc/webrtc.go @@ -255,6 +255,55 @@ func offerHandler(ctx *api.Context, msg *streamer.Message) { ctx.Consumer = conn } +func ExchangeSDP( + stream *streams.Stream, offer string, userAgent string, +) (answer string, err error) { + // create new webrtc instance + conn := new(webrtc.Conn) + conn.Conn, err = NewPConn() + if err != nil { + log.Error().Err(err).Msg("[webrtc] new conn") + return + } + + conn.UserAgent = userAgent + conn.Listen(func(msg interface{}) { + switch msg := msg.(type) { + case streamer.EventType: + if msg == streamer.StateNull { + stream.RemoveConsumer(conn) + } + } + }) + + // 1. SetOffer, so we can get remote client codecs + log.Trace().Msgf("[webrtc] offer:\n%s", offer) + + if err = conn.SetOffer(offer); err != nil { + log.Warn().Err(err).Msg("[api.webrtc] set offer") + return + } + + // 2. AddConsumer, so we get new tracks + if err = stream.AddConsumer(conn); err != nil { + log.Warn().Err(err).Msg("[api.webrtc] add consumer") + return + } + + conn.Init() + + // exchange sdp without waiting all candidates + //answer, err := conn.ExchangeSDP(offer, false) + answer, err = conn.GetCompleteAnswer() + log.Trace().Msgf("[webrtc] answer\n%s", answer) + + if err != nil { + log.Error().Err(err).Msg("[webrtc] get answer") + } + + return +} + func candidateHandler(ctx *api.Context, msg *streamer.Message) { if ctx.Consumer == nil { return diff --git a/pkg/webrtc/conn.go b/pkg/webrtc/conn.go index b533edd9..f0168966 100644 --- a/pkg/webrtc/conn.go +++ b/pkg/webrtc/conn.go @@ -186,6 +186,15 @@ func (c *Conn) GetAnswer() (answer string, err error) { return sdAnswer.SDP, nil } +func (c *Conn) GetCompleteAnswer() (answer string, err error) { + if _, err = c.GetAnswer(); err != nil { + return + } + + <-webrtc.GatheringCompletePromise(c.Conn) + return c.Conn.LocalDescription().SDP, nil +} + func (c *Conn) remote() string { for _, trans := range c.Conn.GetTransceivers() { pair, _ := trans.Receiver().Transport().ICETransport().GetSelectedCandidatePair()