make setCodecPreferences retain position of rtx/red
close to the codec they relate to as it is done by video_engine.
This does not change functionality but improves readability of the SDP
BUG=webrtc:13287
Change-Id: I9b03cd3131eaa932ffed3fb4e66cbf55faedcdd6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/235665
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <philipp.hancke@googlemail.com>
Cr-Commit-Position: refs/heads/main@{#35311}
diff --git a/pc/media_session.cc b/pc/media_session.cc
index a8dcf2c..00daacd 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -741,11 +741,17 @@
const Codecs& codecs,
const Codecs& supported_codecs) {
Codecs filtered_codecs;
- std::set<std::string> kept_codecs_ids;
bool want_rtx = false;
bool want_red = false;
for (const auto& codec_preference : codec_preferences) {
+ if (IsRtxCodec(codec_preference)) {
+ want_rtx = true;
+ } else if (IsRedCodec(codec_preference)) {
+ want_red = true;
+ }
+ }
+ for (const auto& codec_preference : codec_preferences) {
auto found_codec = absl::c_find_if(
supported_codecs,
[&codec_preference](const typename Codecs::value_type& codec) {
@@ -764,33 +770,30 @@
if (FindMatchingCodec(supported_codecs, codecs, *found_codec,
&found_codec_with_correct_pt)) {
filtered_codecs.push_back(found_codec_with_correct_pt);
- kept_codecs_ids.insert(std::to_string(found_codec_with_correct_pt.id));
- }
- } else if (IsRtxCodec(codec_preference)) {
- want_rtx = true;
- } else if (IsRedCodec(codec_preference)) {
- want_red = true;
- }
- }
-
- if (want_rtx || want_red) {
- for (const auto& codec : codecs) {
- if (IsRtxCodec(codec)) {
- const auto apt =
- codec.params.find(cricket::kCodecParamAssociatedPayloadType);
- if (apt != codec.params.end() &&
- kept_codecs_ids.count(apt->second) > 0) {
- filtered_codecs.push_back(codec);
- }
- } else if (IsRedCodec(codec)) {
- const auto fmtp =
- codec.params.find(cricket::kCodecParamNotInNameValueFormat);
- if (fmtp != codec.params.end()) {
- std::vector<std::string> redundant_payloads;
- rtc::split(fmtp->second, '/', &redundant_payloads);
- if (redundant_payloads.size() > 0 &&
- kept_codecs_ids.count(redundant_payloads[0]) > 0) {
- filtered_codecs.push_back(codec);
+ std::string id = rtc::ToString(found_codec_with_correct_pt.id);
+ // Search for the matching rtx or red codec.
+ if (want_red || want_rtx) {
+ for (const auto& codec : codecs) {
+ if (IsRtxCodec(codec)) {
+ const auto apt =
+ codec.params.find(cricket::kCodecParamAssociatedPayloadType);
+ if (apt != codec.params.end() && apt->second == id) {
+ filtered_codecs.push_back(codec);
+ break;
+ }
+ } else if (IsRedCodec(codec)) {
+ const auto fmtp =
+ codec.params.find(cricket::kCodecParamNotInNameValueFormat);
+ if (fmtp != codec.params.end()) {
+ std::vector<std::string> redundant_payloads;
+ rtc::split(fmtp->second, '/', &redundant_payloads);
+ if (redundant_payloads.size() > 0 &&
+ redundant_payloads[0] == id) {
+ filtered_codecs.push_back(codec);
+ break;
+ }
+ }
+ }
}
}
}