From a42c3e21c96046c1391032300c78372b0fac9923 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Sat, 25 Mar 2023 11:41:15 +0300 Subject: [PATCH] Fix input browser via WebTorrent --- cmd/webrtc/init.go | 48 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/cmd/webrtc/init.go b/cmd/webrtc/init.go index 73d73503..d760d688 100644 --- a/cmd/webrtc/init.go +++ b/cmd/webrtc/init.go @@ -201,13 +201,17 @@ func ExchangeSDP(stream *streams.Stream, offer, desc, userAgent string) (answer // create new webrtc instance conn := webrtc.NewConn(pc) conn.Desc = desc - conn.Mode = core.ModePassiveConsumer conn.UserAgent = userAgent conn.Listen(func(msg any) { switch msg := msg.(type) { case pion.PeerConnectionState: - if msg == pion.PeerConnectionStateClosed { + if msg != pion.PeerConnectionStateClosed { + return + } + if conn.Mode == core.ModePassiveConsumer { stream.RemoveConsumer(conn) + } else { + stream.RemoveProducer(conn) } } }) @@ -220,11 +224,19 @@ func ExchangeSDP(stream *streams.Stream, offer, desc, userAgent string) (answer return } - // 2. AddConsumer, so we get new tracks - if err = stream.AddConsumer(conn); err != nil { - log.Warn().Err(err).Caller().Send() - _ = conn.Close() - return + if IsConsumer(conn) { + conn.Mode = core.ModePassiveConsumer + + // 2. AddConsumer, so we get new tracks + if err = stream.AddConsumer(conn); err != nil { + log.Warn().Err(err).Caller().Send() + _ = conn.Close() + return + } + } else { + conn.Mode = core.ModePassiveProducer + + stream.AddProducer(conn) } answer, err = conn.GetCompleteAnswer() @@ -239,3 +251,25 @@ func ExchangeSDP(stream *streams.Stream, offer, desc, userAgent string) (answer return } + +func IsConsumer(conn *webrtc.Conn) bool { + // if wants get video - consumer + for _, media := range conn.GetMedias() { + if media.Kind == core.KindVideo && media.Direction == core.DirectionSendonly { + return true + } + } + // if wants send video - producer + for _, media := range conn.GetMedias() { + if media.Kind == core.KindVideo && media.Direction == core.DirectionRecvonly { + return false + } + } + // if wants something - consumer + for _, media := range conn.GetMedias() { + if media.Direction == core.DirectionSendonly { + return true + } + } + return false +}