Fix support sendrecv media for WebRTC passive consumer
This commit is contained in:
+12
-4
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user