Fix support sendrecv media for WebRTC passive consumer

This commit is contained in:
Alexey Khit
2023-03-12 21:43:11 +03:00
parent d686d4f691
commit a6393da956
2 changed files with 30 additions and 5 deletions
+12 -4
View File
@@ -19,11 +19,11 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer.
switch track.Direction { switch track.Direction {
case streamer.DirectionSendonly: case streamer.DirectionSendonly:
// send our track to WebRTC consumer // send our track to WebRTC consumer
return c.addConsumerSendTrack(track) return c.addConsumerSendTrack(media, track)
case streamer.DirectionRecvonly: case streamer.DirectionRecvonly:
// receive track from WebRTC consumer (microphone, backchannel, two way audio) // receive track from WebRTC consumer (microphone, backchannel, two way audio)
return c.addConsumerRecvTrack(track) return c.addConsumerRecvTrack(media, track)
} }
case streamer.ModePassiveProducer: case streamer.ModePassiveProducer:
@@ -42,7 +42,7 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer.
panic("not implemented") 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 codec := track.Codec
// webrtc.codecParametersFuzzySearch // webrtc.codecParametersFuzzySearch
@@ -73,6 +73,10 @@ func (c *Conn) addConsumerSendTrack(track *streamer.Track) *streamer.Track {
return nil return nil
} }
if err = tr.SetMid(media.MID); err != nil {
return nil
}
codecs := []webrtc.RTPCodecParameters{{RTPCodecCapability: caps}} codecs := []webrtc.RTPCodecParameters{{RTPCodecCapability: caps}}
if err = tr.SetCodecPreferences(codecs); err != nil { if err = tr.SetCodecPreferences(codecs); err != nil {
return nil return nil
@@ -110,7 +114,7 @@ func (c *Conn) addConsumerSendTrack(track *streamer.Track) *streamer.Track {
return 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{ caps := webrtc.RTPCodecCapability{
MimeType: MimeType(track.Codec), MimeType: MimeType(track.Codec),
ClockRate: track.Codec.ClockRate, ClockRate: track.Codec.ClockRate,
@@ -123,6 +127,10 @@ func (c *Conn) addConsumerRecvTrack(track *streamer.Track) *streamer.Track {
return nil return nil
} }
if err = tr.SetMid(media.MID); err != nil {
return nil
}
codecs := []webrtc.RTPCodecParameters{ codecs := []webrtc.RTPCodecParameters{
{RTPCodecCapability: caps, PayloadType: webrtc.PayloadType(track.Codec.PayloadType)}, {RTPCodecCapability: caps, PayloadType: webrtc.PayloadType(track.Codec.PayloadType)},
} }
+18 -1
View File
@@ -33,7 +33,8 @@ func (c *Conn) SetOffer(offer string) (err error) {
} }
func (c *Conn) GetAnswer() (answer 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 // init all Sender(s) for passive producer or they will be nil
// sender for passive producer is backchannel // sender for passive producer is backchannel
sd := &sdp.SessionDescription{} 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 // we need to process remote offer after we create transeivers