MCPcopy
hub / github.com/pion/webrtc / updateFromRemoteDescription

Method updateFromRemoteDescription

mediaengine.go:606–714  ·  view source on GitHub ↗

Update the MediaEngine from a remote description.

(desc sdp.SessionDescription)

Source from the content-addressed store, hash-verified

604
605// Update the MediaEngine from a remote description.
606func (m *MediaEngine) updateFromRemoteDescription(desc sdp.SessionDescription) error { //nolint:cyclop,gocognit
607 m.mu.Lock()
608 defer m.mu.Unlock()
609
610 for _, media := range desc.MediaDescriptions {
611 var typ RTPCodecType
612
613 switch {
614 case strings.EqualFold(media.MediaName.Media, "audio"):
615 typ = RTPCodecTypeAudio
616 case strings.EqualFold(media.MediaName.Media, "video"):
617 typ = RTPCodecTypeVideo
618 }
619
620 switch {
621 case !m.negotiatedAudio && typ == RTPCodecTypeAudio:
622 m.negotiatedAudio = true
623 case !m.negotiatedVideo && typ == RTPCodecTypeVideo:
624 m.negotiatedVideo = true
625 default:
626 // update header extesions from remote sdp if codec is negotiated, Firefox
627 // would send updated header extension in renegotiation.
628 // e.g. publish first track without simucalst ->negotiated-> publish second track with simucalst
629 // then the two media secontions have different rtp header extensions in offer
630 if err := m.updateHeaderExtensionFromMediaSection(media); err != nil {
631 return err
632 }
633
634 if !m.negotiateMultiCodecs || (typ != RTPCodecTypeAudio && typ != RTPCodecTypeVideo) {
635 continue
636 }
637 }
638
639 codecs, err := codecsFromMediaDescription(media)
640 if err != nil {
641 return err
642 }
643
644 addIfNew := func(existingCodecs []RTPCodecParameters, codec RTPCodecParameters) []RTPCodecParameters {
645 found := false
646 for _, existingCodec := range existingCodecs {
647 if existingCodec.PayloadType == codec.PayloadType {
648 found = true
649
650 break
651 }
652 }
653
654 if !found {
655 existingCodecs = append(existingCodecs, codec)
656 }
657
658 return existingCodecs
659 }
660
661 exactMatches := make([]RTPCodecParameters, 0, len(codecs))
662 partialMatches := make([]RTPCodecParameters, 0, len(codecs))
663

Callers 4

TestExtensionIdCollisionFunction · 0.95
SetRemoteDescriptionMethod · 0.80

Calls 5

matchRemoteCodecMethod · 0.95
pushCodecsMethod · 0.95
rtcpFeedbackIntersectionFunction · 0.85

Tested by 3

TestExtensionIdCollisionFunction · 0.76