Bug 1379265 - Add RsdparsaSdpParser to JsepSessionImp; r=bwc

MozReview-Commit-ID: 6F4OQnldJez

--HG--
extra : rebase_source : 19dea073e0e252bb6771c8eb7670dcbf4ba9a941
This commit is contained in:
Paul Ellenbogen 2018-01-11 15:14:17 -05:00
Родитель ef68d81ca0
Коммит 039d9a80d1
4 изменённых файлов: 75 добавлений и 3 удалений

Просмотреть файл

@ -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<Sdp>* parsedp)
{
UniquePtr<Sdp> parsed = mParser.Parse(sdp);
UniquePtr<Sdp> parsed = mSipccParser.Parse(sdp);
if (mRunRustParser) {
UniquePtr<Sdp> 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;
}

Просмотреть файл

@ -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<Sdp> mPendingRemoteDescription;
PtrVector<JsepCodecDescription> mSupportedCodecs;
std::string mLastError;
SipccSdpParser mParser;
SipccSdpParser mSipccParser;
SdpHelper mSdpHelper;
SsrcGenerator mSsrcGenerator;
bool mRunRustParser;
RsdparsaSdpParser mRsdparsaParser;
};
} // namespace mozilla

Просмотреть файл

@ -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<SdpAttribute::AttributeType>(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<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

Просмотреть файл

@ -120,6 +120,8 @@ class SdpHelper {
const std::vector<SdpExtmapAttributeList::Extmap>& localExtensions,
SdpMediaSection* localMsection);
bool SdpMatch(const Sdp& sdp1, const Sdp& sdp2);
private:
std::string& mLastError;