Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Unified Diff: talk/session/media/mediasession.cc

Issue 1286273003: Fixing problems with RTP extension ID conflict resolution (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Adding unit test Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | talk/session/media/mediasession_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: talk/session/media/mediasession.cc
diff --git a/talk/session/media/mediasession.cc b/talk/session/media/mediasession.cc
index 8d07e95a150d8a53e0190fd4f909d8b188b85137..a1426c34ab3e2b21149c5d789a732021782b827d 100644
--- a/talk/session/media/mediasession.cc
+++ b/talk/session/media/mediasession.cc
@@ -907,20 +907,41 @@ static bool FindByUri(const RtpHeaderExtensions& extensions,
return false;
}
-static void FindAndSetRtpHdrExtUsed(
- const RtpHeaderExtensions& reference_extensions,
- RtpHeaderExtensions* offered_extensions,
- const RtpHeaderExtensions& other_extensions,
- UsedRtpHeaderExtensionIds* used_extensions) {
- for (RtpHeaderExtensions::const_iterator it = reference_extensions.begin();
- it != reference_extensions.end(); ++it) {
- if (!FindByUri(*offered_extensions, *it, NULL)) {
- RtpHeaderExtension ext;
- if (!FindByUri(other_extensions, *it, &ext)) {
- ext = *it;
- used_extensions->FindAndSetIdUsed(&ext);
+// Iterates through |offered_extensions|, adding each one to |all_extensions|
+// and |used_ids|, and resolving ID conflicts. If an offered extension has the
+// same URI as one in |all_extensions|, it will re-use the same ID and won't be
+// treated as a conflict.
+static void FindAndSetRtpHdrExtUsed(RtpHeaderExtensions* offered_extensions,
+ RtpHeaderExtensions* all_extensions,
+ UsedRtpHeaderExtensionIds* used_ids) {
+ for (auto& extension : *offered_extensions) {
+ RtpHeaderExtension existing;
+ if (FindByUri(*all_extensions, extension, &existing)) {
+ extension.id = existing.id;
+ } else {
+ used_ids->FindAndSetIdUsed(&extension);
+ all_extensions->push_back(extension);
+ }
+ }
+}
+
+// Adds |reference_extensions| to |offered_extensions|, while updating
+// |all_extensions| and |used_ids|.
+static void FindRtpHdrExtsToOffer(
+ const RtpHeaderExtensions& reference_extensions,
+ RtpHeaderExtensions* offered_extensions,
+ RtpHeaderExtensions* all_extensions,
+ UsedRtpHeaderExtensionIds* used_ids) {
+ for (auto reference_extension : reference_extensions) {
pthatcher1 2015/08/18 20:33:12 Can't it be "const auto&" instead of auto?
Taylor Brandstetter 2015/08/18 20:55:06 No, because FindAndSetIdUsed modifies the id, and
+ if (!FindByUri(*offered_extensions, reference_extension, NULL)) {
+ RtpHeaderExtension existing;
+ if (FindByUri(*all_extensions, reference_extension, &existing)) {
+ offered_extensions->push_back(existing);
+ } else {
+ used_ids->FindAndSetIdUsed(&reference_extension);
+ all_extensions->push_back(reference_extension);
+ offered_extensions->push_back(reference_extension);
}
- offered_extensions->push_back(ext);
}
}
}
@@ -1398,6 +1419,7 @@ void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer(
// All header extensions allocated from the same range to avoid potential
// issues when using BUNDLE.
UsedRtpHeaderExtensionIds used_ids;
+ RtpHeaderExtensions all_extensions;
audio_extensions->clear();
video_extensions->clear();
@@ -1410,22 +1432,22 @@ void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer(
GetFirstAudioContentDescription(current_description);
if (audio) {
*audio_extensions = audio->rtp_header_extensions();
- used_ids.FindAndSetIdUsed(audio_extensions);
+ FindAndSetRtpHdrExtUsed(audio_extensions, &all_extensions, &used_ids);
}
const VideoContentDescription* video =
GetFirstVideoContentDescription(current_description);
if (video) {
*video_extensions = video->rtp_header_extensions();
- used_ids.FindAndSetIdUsed(video_extensions);
+ FindAndSetRtpHdrExtUsed(video_extensions, &all_extensions, &used_ids);
}
}
// Add our default RTP header extensions that are not in
// |current_description|.
- FindAndSetRtpHdrExtUsed(audio_rtp_header_extensions(), audio_extensions,
- *video_extensions, &used_ids);
- FindAndSetRtpHdrExtUsed(video_rtp_header_extensions(), video_extensions,
- *audio_extensions, &used_ids);
+ FindRtpHdrExtsToOffer(audio_rtp_header_extensions(), audio_extensions,
+ &all_extensions, &used_ids);
+ FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions,
+ &all_extensions, &used_ids);
}
bool MediaSessionDescriptionFactory::AddTransportOffer(
« no previous file with comments | « no previous file | talk/session/media/mediasession_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698