зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1379265 - Add RsdparsaSdpParser to JsepSessionImp; r=bwc
MozReview-Commit-ID: 6F4OQnldJez --HG-- extra : rebase_source : 19dea073e0e252bb6771c8eb7670dcbf4ba9a941
This commit is contained in:
Родитель
ef68d81ca0
Коммит
039d9a80d1
|
@ -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;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче