setCodecPreferences: dont insert red codec twice

this could happen if setCodecPreferences is used to prefer
red over opus as it is done for red+opus.

BUG=webrtc:13287

Change-Id: I3d61cd8f1a364572bc531a75dcc239c3919138cc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/237800
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <philipp.hancke@googlemail.com>
Cr-Commit-Position: refs/heads/main@{#35344}
diff --git a/pc/media_session.cc b/pc/media_session.cc
index c64924a..426eadc 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -1084,6 +1084,9 @@
                 break;
               }
             } else if (IsRedCodec(codec)) {
+              // For RED, do not insert the codec again if it was already
+              // inserted. audio/red for opus gets enabled by having RED before
+              // the primary codec.
               const auto fmtp =
                   codec.params.find(cricket::kCodecParamNotInNameValueFormat);
               if (fmtp != codec.params.end()) {
@@ -1091,7 +1094,10 @@
                 rtc::split(fmtp->second, '/', &redundant_payloads);
                 if (redundant_payloads.size() > 0 &&
                     redundant_payloads[0] == id) {
-                  filtered_codecs.push_back(codec);
+                  if (std::find(filtered_codecs.begin(), filtered_codecs.end(),
+                                codec) == filtered_codecs.end()) {
+                    filtered_codecs.push_back(codec);
+                  }
                   break;
                 }
               }