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 {
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)},
}
+18 -1
View File
@@ -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