Bug 1379265 - Add RsdparsaSdpParser to JsepSessionImp; r?bwc
MozReview-Commit-ID: 6F4OQnldJez
--- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp
+++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp
@@ -13,22 +13,24 @@
#include "nspr.h"
#include "nss.h"
#include "pk11pub.h"
#include "nsDebug.h"
#include "logging.h"
#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"
#include "mozilla/net/DataChannelProtocol.h"
namespace mozilla {
MOZ_MTLOG_MODULE("jsep")
@@ -60,16 +62,18 @@ JsepSessionImpl::Init()
MOZ_ASSERT(!mSessionId, "Init called more than once");
nsresult rv = SetupIds();
NS_ENSURE_SUCCESS(rv, rv);
SetupDefaultCodecs();
SetupDefaultRtpExtensions();
+ mRunRustParser = Preferences::GetBool("media.webrtc.rsdparsa_enabled", false);
+
return NS_OK;
}
nsresult
JsepSessionImpl::AddTransceiver(RefPtr<JsepTransceiver> transceiver)
{
mLastError.clear();
MOZ_MTLOG(ML_DEBUG, "[" << mName << "]: Adding transceiver.");
@@ -1254,20 +1258,47 @@ JsepSessionImpl::CopyPreviousMsid(const
oldMsection.GetAttributeList().GetMsid()));
}
}
}
nsresult
JsepSessionImpl::ParseSdp(const std::string& sdp, UniquePtr<Sdp>* parsedp)
{
- UniquePtr<Sdp> parsed = mParser.Parse(sdp);
+ UniquePtr<Sdp> parsed = mSipccParser.Parse(sdp);
+ if (mRunRustParser) {
+ UniquePtr<Sdp> rustParsed = mRsdparsaParser.Parse(sdp);
+#if 0
+ // TODO: Register these telemetry probes, see Bug 1432955
+ // See https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Adding_a_new_Telemetry_probe
+ if (!parsed && !rustParsed) {
+ Telemetry::Accumulate(Telemetry::HistogramDUMMY1, // Telemetry::WEBRTC_RUST_SDP_PARSE_STATUS,
+ 3);
+ } else if (parsed && !rustParsed) {
+ Telemetry::Accumulate(Telemetry::HistogramDUMMY1, // Telemetry::WEBRTC_RUST_SDP_PARSE_STATUS,
+ 2);
+ } else if (!parsed && rustParsed) {
+ Telemetry::Accumulate(Telemetry::HistogramDUMMY1, // Telemetry::WEBRTC_RUST_SDP_PARSE_STATUS,
+ 1);
+ } else {
+ Telemetry::Accumulate(Telemetry::HistogramDUMMY1, // Telemetry::WEBRTC_RUST_SDP_PARSE_STATUS,
+ 0);
+ if (mSdpHelper.SdpMatch(*parsed, *rustParsed)) {
+ Telemetry::Accumulate(Telemetry::HistogramDUMMY1, // Telemetry::WEBRTC_RUST_SDP_PARSE_MATCH,
+ 1);
+ } else {
+ Telemetry::Accumulate(Telemetry::HistogramDUMMY1, // Telemetry::WEBRTC_RUST_SDP_PARSE_MATCH,
+ 0);
+ }
+ }
+#endif
+ }
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;
}
// Verify that the JSEP rules for all SDP are followed
if (!parsed->GetMediaSectionCount()) {
JSEP_SET_ERROR("Description has no media sections");
return NS_ERROR_INVALID_ARG;
--- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.h
+++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.h
@@ -9,16 +9,17 @@
#include <string>
#include <vector>
#include "signaling/src/jsep/JsepCodecDescription.h"
#include "signaling/src/jsep/JsepSession.h"
#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"
namespace mozilla {
class JsepUuidGenerator
{
@@ -278,16 +279,18 @@ private:
std::set<uint32_t> mSsrcs;
UniquePtr<Sdp> mGeneratedLocalDescription; // Created but not set.
UniquePtr<Sdp> mCurrentLocalDescription;
UniquePtr<Sdp> mCurrentRemoteDescription;
UniquePtr<Sdp> mPendingLocalDescription;
UniquePtr<Sdp> mPendingRemoteDescription;
PtrVector<JsepCodecDescription> mSupportedCodecs;
std::string mLastError;
- SipccSdpParser mParser;
+ SipccSdpParser mSipccParser;
SdpHelper mSdpHelper;
SsrcGenerator mSsrcGenerator;
+ bool mRunRustParser;
+ RsdparsaSdpParser mRsdparsaParser;
};
} // namespace mozilla
#endif
--- a/media/webrtc/signaling/src/sdp/SdpHelper.cpp
+++ b/media/webrtc/signaling/src/sdp/SdpHelper.cpp
@@ -814,11 +814,66 @@ SdpHelper::GetMsectionBundleType(const S
*masterMid = mid;
}
return kMasterBundle;
}
}
return kNoBundle;
}
+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<SdpAttribute::AttributeType>(i);
+ if (list1.HasAttribute(attributeType, false) != list2.HasAttribute(attributeType, false)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+MediaSectionMatch(const SdpMediaSection& mediaSection1,
+ const SdpMediaSection& mediaSection2)
+{
+ if (!AttributeListMatch(mediaSection1.GetAttributeList(),
+ mediaSection2.GetAttributeList())) {
+ return false;
+ }
+ if (mediaSection1.GetPort() != mediaSection2.GetPort()) {
+ return false;
+ }
+ const std::vector<std::string>& formats1 = mediaSection1.GetFormats();
+ const std::vector<std::string>& formats2 = mediaSection2.GetFormats();
+ auto formats1Set = std::set<std::string>(formats1.begin(), formats1.end());
+ auto formats2Set = std::set<std::string>(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
--- a/media/webrtc/signaling/src/sdp/SdpHelper.h
+++ b/media/webrtc/signaling/src/sdp/SdpHelper.h
@@ -115,16 +115,18 @@ class SdpHelper {
static bool GetPtAsInt(const std::string& ptString, uint16_t* ptOutparam);
void AddCommonExtmaps(
const SdpMediaSection& remoteMsection,
const std::vector<SdpExtmapAttributeList::Extmap>& localExtensions,
SdpMediaSection* localMsection);
+ bool SdpMatch(const Sdp& sdp1, const Sdp& sdp2);
+
private:
std::string& mLastError;
DISALLOW_COPY_ASSIGN(SdpHelper);
};
} // namespace mozilla
#endif // _SDPHELPER_H_