From c70c3a58f1c5ef13a28ad19cc816706a318fad34 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Wed, 1 Mar 2023 18:01:11 +0300 Subject: [PATCH] Add media list option to webrtc create function --- cmd/webrtc/client.go | 14 ++++++++++++-- pkg/webrtc/client.go | 25 ++++++++++++++++--------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/cmd/webrtc/client.go b/cmd/webrtc/client.go index c72d827b..2819fb00 100644 --- a/cmd/webrtc/client.go +++ b/cmd/webrtc/client.go @@ -60,8 +60,13 @@ func asyncClient(url string) (streamer.Producer, error) { } }) + medias := []*streamer.Media{ + {Kind: streamer.KindVideo, Direction: streamer.DirectionRecvonly}, + {Kind: streamer.KindAudio, Direction: streamer.DirectionRecvonly}, + } + // 3. Create offer - offer, err := prod.CreateOffer() + offer, err := prod.CreateOffer(medias) if err != nil { return nil, err } @@ -123,8 +128,13 @@ func syncClient(url string) (streamer.Producer, error) { prod := webrtc.NewConn(pc) + medias := []*streamer.Media{ + {Kind: streamer.KindVideo, Direction: streamer.DirectionRecvonly}, + {Kind: streamer.KindAudio, Direction: streamer.DirectionRecvonly}, + } + // 3. Create offer - offer, err := prod.CreateCompleteOffer() + offer, err := prod.CreateCompleteOffer(medias) if err != nil { return nil, err } diff --git a/pkg/webrtc/client.go b/pkg/webrtc/client.go index 715b8a11..d39a547d 100644 --- a/pkg/webrtc/client.go +++ b/pkg/webrtc/client.go @@ -6,10 +6,16 @@ import ( "github.com/pion/webrtc/v3" ) -func (c *Conn) CreateOffer() (string, error) { - init := webrtc.RTPTransceiverInit{Direction: webrtc.RTPTransceiverDirectionRecvonly} - _, _ = c.pc.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo, init) - _, _ = c.pc.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio, init) +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 { @@ -20,11 +26,11 @@ func (c *Conn) CreateOffer() (string, error) { return "", err } - return desc.SDP, nil + return c.pc.LocalDescription().SDP, nil } -func (c *Conn) CreateCompleteOffer() (string, error) { - if _, err := c.CreateOffer(); err != nil { +func (c *Conn) CreateCompleteOffer(medias []*streamer.Media) (string, error) { + if _, err := c.CreateOffer(medias); err != nil { return "", err } @@ -47,13 +53,14 @@ func (c *Conn) SetAnswer(answer string) (err error) { // 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 { + if media.Kind == streamer.KindVideo && media.Direction != "" { c.medias = append(c.medias, media) } } for _, media := range medias { - if media.Kind == streamer.KindAudio { + if media.Kind == streamer.KindAudio && media.Direction != "" { c.medias = append(c.medias, media) } }