Bug 1406529: ensure unique extmap IDs
MozReview-Commit-ID: JIzYsUWLMfS
--- a/media/webrtc/signaling/src/jsep/JsepSession.h
+++ b/media/webrtc/signaling/src/jsep/JsepSession.h
@@ -53,16 +53,28 @@ struct JsepOfferOptions : public JsepOAO
struct JsepAnswerOptions : public JsepOAOptions {};
enum JsepBundlePolicy {
kBundleBalanced,
kBundleMaxCompat,
kBundleMaxBundle
};
+enum JsepMediaType {
+ kNone = 0,
+ kAudio,
+ kVideo,
+ kAudioVideo
+};
+
+struct JsepExtmapMediaType {
+ JsepMediaType mMediaType;
+ SdpExtmapAttributeList::Extmap mExtmap;
+};
+
class JsepSession
{
public:
explicit JsepSession(const std::string& name)
: mName(name), mState(kJsepStateStable), mNegotiations(0)
{
}
virtual ~JsepSession() {}
@@ -98,16 +110,18 @@ public:
virtual nsresult AddDtlsFingerprint(const std::string& algorithm,
const std::vector<uint8_t>& value) = 0;
virtual nsresult AddAudioRtpExtension(const std::string& extensionName,
SdpDirectionAttribute::Direction direction) = 0;
virtual nsresult AddVideoRtpExtension(const std::string& extensionName,
SdpDirectionAttribute::Direction direction) = 0;
+ virtual nsresult AddAudioVideoRtpExtension(const std::string& extensionName,
+ SdpDirectionAttribute::Direction direction) = 0;
// Kinda gross to be locking down the data structure type like this, but
// returning by value is problematic due to the lack of stl move semantics in
// our build config, since we can't use UniquePtr in the container. The
// alternative is writing a raft of accessor functions that allow arbitrary
// manipulation (which will be unwieldy), or allowing functors to be injected
// that manipulate the data structure (still pretty unwieldy).
virtual std::vector<JsepCodecDescription*>& Codecs() = 0;
--- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp
+++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp
@@ -144,57 +144,75 @@ JsepSessionImpl::AddDtlsFingerprint(cons
fp.mValue = value;
mDtlsFingerprints.push_back(fp);
return NS_OK;
}
nsresult
-JsepSessionImpl::AddRtpExtension(std::vector<SdpExtmapAttributeList::Extmap>& extensions,
+JsepSessionImpl::AddRtpExtension(JsepMediaType mediaType,
const std::string& extensionName,
SdpDirectionAttribute::Direction direction)
{
mLastError.clear();
- if (extensions.size() + 1 > UINT16_MAX) {
+ if (mRtpExtensions.size() + 1 > UINT16_MAX) {
JSEP_SET_ERROR("Too many rtp extensions have been added");
return NS_ERROR_FAILURE;
}
- // Avoid adding duplicate entries
- for (auto ext = extensions.begin(); ext != extensions.end(); ++ext) {
- if (ext->direction == direction && ext->extensionname == extensionName) {
+ for (auto ext = mRtpExtensions.begin(); ext != mRtpExtensions.end(); ++ext) {
+ if (ext->mExtmap.direction == direction &&
+ ext->mExtmap.extensionname == extensionName) {
+ if (ext->mMediaType != mediaType) {
+ ext->mMediaType = JsepMediaType::kAudioVideo;
+ }
return NS_OK;
}
}
- SdpExtmapAttributeList::Extmap extmap =
- { static_cast<uint16_t>(extensions.size() + 1),
+ JsepExtmapMediaType extMediaType =
+ { mediaType,
+ { static_cast<uint16_t>(mRtpExtensions.size() + 1),
direction,
- direction != SdpDirectionAttribute::kSendrecv, // do we want to specify direction?
+ // do we want to specify direction?
+ direction != SdpDirectionAttribute::kSendrecv,
extensionName,
- "" };
+ "" }};
- extensions.push_back(extmap);
+ mRtpExtensions.push_back(extMediaType);
return NS_OK;
}
nsresult
JsepSessionImpl::AddAudioRtpExtension(const std::string& extensionName,
SdpDirectionAttribute::Direction direction)
{
- return AddRtpExtension(mAudioRtpExtensions, extensionName, direction);
+ return AddRtpExtension(JsepMediaType::kAudio,
+ extensionName,
+ direction);
}
nsresult
JsepSessionImpl::AddVideoRtpExtension(const std::string& extensionName,
SdpDirectionAttribute::Direction direction)
{
- return AddRtpExtension(mVideoRtpExtensions, extensionName, direction);
+ return AddRtpExtension(JsepMediaType::kVideo,
+ extensionName,
+ direction);
+}
+
+nsresult
+JsepSessionImpl::AddAudioVideoRtpExtension(const std::string& extensionName,
+ SdpDirectionAttribute::Direction direction)
+{
+ return AddRtpExtension(JsepMediaType::kAudioVideo,
+ extensionName,
+ direction);
}
nsresult
JsepSessionImpl::CreateOfferMsection(const JsepOfferOptions& options,
JsepTransceiver& transceiver,
Sdp* local)
{
JsepTrack& sendTrack(transceiver.mSendTrack);
@@ -487,34 +505,42 @@ JsepSessionImpl::AddMid(const std::strin
msection->GetAttributeList().SetAttribute(new SdpStringAttribute(
SdpAttribute::kMidAttribute, mid));
}
std::vector<SdpExtmapAttributeList::Extmap>
JsepSessionImpl::GetRtpExtensions(const SdpMediaSection& msection)
{
std::vector<SdpExtmapAttributeList::Extmap> result;
+ JsepMediaType mediaType = JsepMediaType::kNone;
switch (msection.GetMediaType()) {
case SdpMediaSection::kAudio:
- result = mAudioRtpExtensions;
+ mediaType = JsepMediaType::kAudio;
break;
case SdpMediaSection::kVideo:
- result = mVideoRtpExtensions;
+ mediaType = JsepMediaType::kVideo;
if (msection.GetAttributeList().HasAttribute(
SdpAttribute::kRidAttribute)) {
// We need RID support
// TODO: Would it be worth checking that the direction is sane?
- AddRtpExtension(result,
- webrtc::RtpExtension::kRtpStreamIdUri,
- SdpDirectionAttribute::kSendonly);
+ AddVideoRtpExtension(webrtc::RtpExtension::kRtpStreamIdUri,
+ SdpDirectionAttribute::kSendonly);
}
break;
default:
;
}
+ if (mediaType != JsepMediaType::kNone) {
+ for (auto ext = mRtpExtensions.begin(); ext != mRtpExtensions.end(); ++ext) {
+ if (ext->mMediaType == mediaType ||
+ ext->mMediaType == JsepMediaType::kAudioVideo) {
+ result.push_back(ext->mExtmap);
+ }
+ }
+ }
return result;
}
void
JsepSessionImpl::AddCommonExtmaps(const SdpMediaSection& remoteMsection,
SdpMediaSection* msection)
{
mSdpHelper.AddCommonExtmaps(
@@ -2062,24 +2088,22 @@ JsepSessionImpl::SetupDefaultCodecs()
void
JsepSessionImpl::SetupDefaultRtpExtensions()
{
AddAudioRtpExtension(webrtc::RtpExtension::kAudioLevelUri,
SdpDirectionAttribute::Direction::kSendrecv);
AddAudioRtpExtension(webrtc::RtpExtension::kCsrcAudioLevelUri,
SdpDirectionAttribute::Direction::kRecvonly);
- AddAudioRtpExtension(webrtc::RtpExtension::kMIdUri,
- SdpDirectionAttribute::Direction::kSendrecv);
+ AddAudioVideoRtpExtension(webrtc::RtpExtension::kMIdUri,
+ SdpDirectionAttribute::Direction::kSendrecv);
AddVideoRtpExtension(webrtc::RtpExtension::kAbsSendTimeUri,
SdpDirectionAttribute::Direction::kSendrecv);
AddVideoRtpExtension(webrtc::RtpExtension::kTimestampOffsetUri,
SdpDirectionAttribute::Direction::kSendrecv);
- AddVideoRtpExtension(webrtc::RtpExtension::kMIdUri,
- SdpDirectionAttribute::Direction::kSendrecv);
}
void
JsepSessionImpl::SetState(JsepSignalingState state)
{
if (state == mState)
return;
--- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.h
+++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.h
@@ -72,29 +72,34 @@ public:
GetIceOptions() const override
{
return mIceOptions;
}
virtual nsresult AddDtlsFingerprint(const std::string& algorithm,
const std::vector<uint8_t>& value) override;
- nsresult AddRtpExtension(std::vector<SdpExtmapAttributeList::Extmap>& extensions,
+ nsresult AddRtpExtension(JsepMediaType mediaType,
const std::string& extensionName,
SdpDirectionAttribute::Direction direction);
virtual nsresult AddAudioRtpExtension(
const std::string& extensionName,
SdpDirectionAttribute::Direction direction =
SdpDirectionAttribute::Direction::kSendrecv) override;
virtual nsresult AddVideoRtpExtension(
const std::string& extensionName,
SdpDirectionAttribute::Direction direction =
SdpDirectionAttribute::Direction::kSendrecv) override;
+ virtual nsresult AddAudioVideoRtpExtension(
+ const std::string& extensionName,
+ SdpDirectionAttribute::Direction direction =
+ SdpDirectionAttribute::Direction::kSendrecv) override;
+
virtual std::vector<JsepCodecDescription*>&
Codecs() override
{
return mSupportedCodecs.values;
}
virtual nsresult CreateOffer(const JsepOfferOptions& options,
std::string* offer) override;
@@ -264,18 +269,17 @@ private:
bool mLocalIceIsRestarting;
bool mRemoteIsIceLite;
bool mRemoteIceIsRestarting;
std::vector<std::string> mIceOptions;
JsepBundlePolicy mBundlePolicy;
std::vector<JsepDtlsFingerprint> mDtlsFingerprints;
uint64_t mSessionId;
uint64_t mSessionVersion;
- std::vector<SdpExtmapAttributeList::Extmap> mAudioRtpExtensions;
- std::vector<SdpExtmapAttributeList::Extmap> mVideoRtpExtensions;
+ std::vector<JsepExtmapMediaType> mRtpExtensions;
UniquePtr<JsepUuidGenerator> mUuidGen;
std::string mDefaultRemoteStreamId;
std::string mCNAME;
// Used to prevent duplicate local SSRCs. Not used to prevent local/remote or
// remote-only duplication, which will be important for EKT but not now.
std::set<uint32_t> mSsrcs;
UniquePtr<Sdp> mGeneratedLocalDescription; // Created but not set.
UniquePtr<Sdp> mCurrentLocalDescription;