Update the MediaEngine from a remote description.
(desc sdp.SessionDescription)
| 604 | |
| 605 | // Update the MediaEngine from a remote description. |
| 606 | func (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 |