diff --git a/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp b/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp index 65350f7cef7a..1fb76a4c694e 100644 --- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp +++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp @@ -18,12 +18,14 @@ #include "mozilla/Move.h" #include "mozilla/UniquePtr.h" +#include "mozilla/Preferences.h" #include "mozilla/Telemetry.h" #include "webrtc/config.h" #include "signaling/src/jsep/JsepTrack.h" #include "signaling/src/jsep/JsepTransport.h" +#include "signaling/src/sdp/RsdparsaSdpParser.h" #include "signaling/src/sdp/Sdp.h" #include "signaling/src/sdp/SipccSdp.h" #include "signaling/src/sdp/SipccSdpParser.h" @@ -65,6 +67,8 @@ JsepSessionImpl::Init() SetupDefaultCodecs(); SetupDefaultRtpExtensions(); + mRunRustParser = Preferences::GetBool("media.webrtc.rsdparsa_enabled", false); + return NS_OK; } @@ -1259,10 +1263,13 @@ JsepSessionImpl::CopyPreviousMsid(const Sdp& oldLocal, Sdp* newLocal) nsresult JsepSessionImpl::ParseSdp(const std::string& sdp, UniquePtr* parsedp) { - UniquePtr parsed = mParser.Parse(sdp); + UniquePtr parsed = mSipccParser.Parse(sdp); + if (mRunRustParser) { + UniquePtr rustParsed = mRsdparsaParser.Parse(sdp); + } if (!parsed) { std::string error = "Failed to parse SDP: "; - mSdpHelper.appendSdpParseErrors(mParser.GetParseErrors(), &error); + mSdpHelper.appendSdpParseErrors(mSipccParser.GetParseErrors(), &error); JSEP_SET_ERROR(error); return NS_ERROR_INVALID_ARG; } diff --git a/media/webrtc/signaling/src/jsep/JsepSessionImpl.h b/media/webrtc/signaling/src/jsep/JsepSessionImpl.h index 15fcbde09769..d9148d66c873 100644 --- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.h +++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.h @@ -14,6 +14,7 @@ #include "signaling/src/jsep/JsepTrack.h" #include "signaling/src/jsep/JsepTransceiver.h" #include "signaling/src/jsep/SsrcGenerator.h" +#include "signaling/src/sdp/RsdparsaSdpParser.h" #include "signaling/src/sdp/SipccSdpParser.h" #include "signaling/src/sdp/SdpHelper.h" #include "signaling/src/common/PtrVector.h" @@ -283,9 +284,11 @@ private: UniquePtr mPendingRemoteDescription; PtrVector mSupportedCodecs; std::string mLastError; - SipccSdpParser mParser; + SipccSdpParser mSipccParser; SdpHelper mSdpHelper; SsrcGenerator mSsrcGenerator; + bool mRunRustParser; + RsdparsaSdpParser mRsdparsaParser; }; } // namespace mozilla diff --git a/media/webrtc/signaling/src/sdp/SdpHelper.cpp b/media/webrtc/signaling/src/sdp/SdpHelper.cpp index 011dc30c7b98..f9714ff65854 100644 --- a/media/webrtc/signaling/src/sdp/SdpHelper.cpp +++ b/media/webrtc/signaling/src/sdp/SdpHelper.cpp @@ -819,6 +819,66 @@ SdpHelper::GetMsectionBundleType(const Sdp& sdp, return kNoBundle; } +static bool +AttributeListMatch(const SdpAttributeList& list1, const SdpAttributeList& list2) +{ + // TODO: Consider adding telemetry in this function to record which + // attributes don't match. See Bug 1432955. + for (int i = SdpAttribute::kFirstAttribute; i <= SdpAttribute::kLastAttribute; i++) { + auto attributeType = static_cast(i); + // TODO: We should do more thorough checking here, e.g. serialize and + // compare strings. See Bug 1439690. + if (list1.HasAttribute(attributeType, false) != + list2.HasAttribute(attributeType, false)) { + return false; + } + } + return true; +} + +static bool +MediaSectionMatch(const SdpMediaSection& mediaSection1, + const SdpMediaSection& mediaSection2) +{ + // TODO: We should do more thorough checking in this function. + // See Bug 1439690. + if (!AttributeListMatch(mediaSection1.GetAttributeList(), + mediaSection2.GetAttributeList())) { + return false; + } + if (mediaSection1.GetPort() != mediaSection2.GetPort()) { + return false; + } + const std::vector& formats1 = mediaSection1.GetFormats(); + const std::vector& formats2 = mediaSection2.GetFormats(); + auto formats1Set = std::set(formats1.begin(), formats1.end()); + auto formats2Set = std::set(formats2.begin(), formats2.end()); + if (formats1Set != formats2Set) { + return false; + } + return true; +} + +bool +SdpHelper::SdpMatch(const Sdp& sdp1, const Sdp& sdp2) +{ + if (sdp1.GetMediaSectionCount() != sdp2.GetMediaSectionCount()) { + return false; + } + if (!AttributeListMatch(sdp1.GetAttributeList(), sdp2.GetAttributeList())) { + return false; + } + for (size_t i = 0; i < sdp1.GetMediaSectionCount(); i++) { + const SdpMediaSection& mediaSection1 = sdp1.GetMediaSection(i); + const SdpMediaSection& mediaSection2 = sdp2.GetMediaSection(i); + if (!MediaSectionMatch(mediaSection1, mediaSection2)) { + return false; + } + } + + return true; +} + } // namespace mozilla diff --git a/media/webrtc/signaling/src/sdp/SdpHelper.h b/media/webrtc/signaling/src/sdp/SdpHelper.h index 60b1218df9ae..ba5bb20c3b40 100644 --- a/media/webrtc/signaling/src/sdp/SdpHelper.h +++ b/media/webrtc/signaling/src/sdp/SdpHelper.h @@ -120,6 +120,8 @@ class SdpHelper { const std::vector& localExtensions, SdpMediaSection* localMsection); + bool SdpMatch(const Sdp& sdp1, const Sdp& sdp2); + private: std::string& mLastError;