diff --git a/pkg/webrtc/consumer.go b/pkg/webrtc/consumer.go index 90dc9d3f..5ffdcf82 100644 --- a/pkg/webrtc/consumer.go +++ b/pkg/webrtc/consumer.go @@ -19,11 +19,11 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer. switch track.Direction { case streamer.DirectionSendonly: // send our track to WebRTC consumer - return c.addConsumerSendTrack(track) + return c.addConsumerSendTrack(media, track) case streamer.DirectionRecvonly: // receive track from WebRTC consumer (microphone, backchannel, two way audio) - return c.addConsumerRecvTrack(track) + return c.addConsumerRecvTrack(media, track) } case streamer.ModePassiveProducer: @@ -42,7 +42,7 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer. panic("not implemented") } -func (c *Conn) addConsumerSendTrack(track *streamer.Track) *streamer.Track { +func (c *Conn) addConsumerSendTrack(media *streamer.Media, track *streamer.Track) *streamer.Track { codec := track.Codec // webrtc.codecParametersFuzzySearch @@ -73,6 +73,10 @@ func (c *Conn) addConsumerSendTrack(track *streamer.Track) *streamer.Track { return nil } + if err = tr.SetMid(media.MID); err != nil { + return nil + } + codecs := []webrtc.RTPCodecParameters{{RTPCodecCapability: caps}} if err = tr.SetCodecPreferences(codecs); err != nil { return nil @@ -110,7 +114,7 @@ func (c *Conn) addConsumerSendTrack(track *streamer.Track) *streamer.Track { return track } -func (c *Conn) addConsumerRecvTrack(track *streamer.Track) *streamer.Track { +func (c *Conn) addConsumerRecvTrack(media *streamer.Media, track *streamer.Track) *streamer.Track { caps := webrtc.RTPCodecCapability{ MimeType: MimeType(track.Codec), ClockRate: track.Codec.ClockRate, @@ -123,6 +127,10 @@ func (c *Conn) addConsumerRecvTrack(track *streamer.Track) *streamer.Track { return nil } + if err = tr.SetMid(media.MID); err != nil { + return nil + } + codecs := []webrtc.RTPCodecParameters{ {RTPCodecCapability: caps, PayloadType: webrtc.PayloadType(track.Codec.PayloadType)}, } diff --git a/pkg/webrtc/server.go b/pkg/webrtc/server.go index fb7723be..d72505cb 100644 --- a/pkg/webrtc/server.go +++ b/pkg/webrtc/server.go @@ -33,7 +33,8 @@ func (c *Conn) SetOffer(offer string) (err error) { } func (c *Conn) GetAnswer() (answer string, err error) { - if c.Mode == streamer.ModePassiveProducer { + switch c.Mode { + case streamer.ModePassiveProducer: // init all Sender(s) for passive producer or they will be nil // sender for passive producer is backchannel sd := &sdp.SessionDescription{} @@ -59,6 +60,22 @@ func (c *Conn) GetAnswer() (answer string, err error) { } } } + + case streamer.ModePassiveConsumer: + // fix sendrecv transeivers - set for sendonly codecs from recvonly + for _, tr1 := range c.pc.GetTransceivers() { + for _, tr2 := range c.pc.GetTransceivers() { + if tr1 == tr2 { + continue + } + if tr1.Mid() == tr2.Mid() && tr2.Direction() == webrtc.RTPTransceiverDirectionRecvonly { + codecs := tr2.Receiver().GetParameters().Codecs + if err = tr1.SetCodecPreferences(codecs); err != nil { + return "", err + } + } + } + } } // we need to process remote offer after we create transeivers