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}
This commit is contained in:
Philipp Hancke
2021-10-19 18:27:28 +02:00
committed by WebRTC LUCI CQ
parent 97597c0f51
commit c13e786c8f

View File

@ -741,10 +741,16 @@ static Codecs MatchCodecPreference(
const Codecs& codecs, const Codecs& codecs,
const Codecs& supported_codecs) { const Codecs& supported_codecs) {
Codecs filtered_codecs; Codecs filtered_codecs;
std::set<std::string> kept_codecs_ids;
bool want_rtx = false; bool want_rtx = false;
bool want_red = 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) { for (const auto& codec_preference : codec_preferences) {
auto found_codec = absl::c_find_if( auto found_codec = absl::c_find_if(
supported_codecs, supported_codecs,
@ -764,33 +770,30 @@ static Codecs MatchCodecPreference(
if (FindMatchingCodec(supported_codecs, codecs, *found_codec, if (FindMatchingCodec(supported_codecs, codecs, *found_codec,
&found_codec_with_correct_pt)) { &found_codec_with_correct_pt)) {
filtered_codecs.push_back(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)); std::string id = rtc::ToString(found_codec_with_correct_pt.id);
} // Search for the matching rtx or red codec.
} else if (IsRtxCodec(codec_preference)) { if (want_red || want_rtx) {
want_rtx = true; for (const auto& codec : codecs) {
} else if (IsRedCodec(codec_preference)) { if (IsRtxCodec(codec)) {
want_red = true; const auto apt =
} codec.params.find(cricket::kCodecParamAssociatedPayloadType);
} if (apt != codec.params.end() && apt->second == id) {
filtered_codecs.push_back(codec);
if (want_rtx || want_red) { break;
for (const auto& codec : codecs) { }
if (IsRtxCodec(codec)) { } else if (IsRedCodec(codec)) {
const auto apt = const auto fmtp =
codec.params.find(cricket::kCodecParamAssociatedPayloadType); codec.params.find(cricket::kCodecParamNotInNameValueFormat);
if (apt != codec.params.end() && if (fmtp != codec.params.end()) {
kept_codecs_ids.count(apt->second) > 0) { std::vector<std::string> redundant_payloads;
filtered_codecs.push_back(codec); rtc::split(fmtp->second, '/', &redundant_payloads);
} if (redundant_payloads.size() > 0 &&
} else if (IsRedCodec(codec)) { redundant_payloads[0] == id) {
const auto fmtp = filtered_codecs.push_back(codec);
codec.params.find(cricket::kCodecParamNotInNameValueFormat); break;
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);
} }
} }
} }