Update the header extensions capabilities with mid, rid and rrid

Video and audio senders are missing mid, rid and rrid extensions in
their GetCapabilities call.

Bug: chromium:1007894
Change-Id: Ie9edba28ae32fda5e501913cac694f43bfb185ac
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156560
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29493}
This commit is contained in:
Florent Castelli 2019-10-15 15:24:53 +02:00 committed by Commit Bot
parent 82ed2e852f
commit 8038541a4f
4 changed files with 26 additions and 63 deletions

View File

@ -507,6 +507,12 @@ RtpCapabilities WebRtcVideoEngine::GetCapabilities() const {
webrtc::RtpExtension(webrtc::RtpExtension::kFrameMarkingUri, id++)); webrtc::RtpExtension(webrtc::RtpExtension::kFrameMarkingUri, id++));
capabilities.header_extensions.push_back( capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kColorSpaceUri, id++)); webrtc::RtpExtension(webrtc::RtpExtension::kColorSpaceUri, id++));
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kMidUri, id++));
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kRidUri, id++));
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kRepairedRidUri, id++));
if (webrtc::field_trial::IsEnabled("WebRTC-GenericDescriptorAdvertised")) { if (webrtc::field_trial::IsEnabled("WebRTC-GenericDescriptorAdvertised")) {
capabilities.header_extensions.push_back(webrtc::RtpExtension( capabilities.header_extensions.push_back(webrtc::RtpExtension(
webrtc::RtpExtension::kGenericFrameDescriptorUri00, id++)); webrtc::RtpExtension::kGenericFrameDescriptorUri00, id++));

View File

@ -531,6 +531,12 @@ RtpCapabilities WebRtcVoiceEngine::GetCapabilities() const {
webrtc::RtpExtension(webrtc::RtpExtension::kAbsSendTimeUri, id++)); webrtc::RtpExtension(webrtc::RtpExtension::kAbsSendTimeUri, id++));
capabilities.header_extensions.push_back(webrtc::RtpExtension( capabilities.header_extensions.push_back(webrtc::RtpExtension(
webrtc::RtpExtension::kTransportSequenceNumberUri, id++)); webrtc::RtpExtension::kTransportSequenceNumberUri, id++));
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kMidUri, id++));
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kRidUri, id++));
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kRepairedRidUri, id++));
return capabilities; return capabilities;
} }

View File

@ -1357,30 +1357,25 @@ void MediaSessionDescriptionFactory::set_audio_codecs(
ComputeAudioCodecsIntersectionAndUnion(); ComputeAudioCodecsIntersectionAndUnion();
} }
static void AddUnifiedPlanExtensions(RtpHeaderExtensions* extensions) { static void RemoveUnifiedPlanExtensions(RtpHeaderExtensions* extensions) {
RTC_DCHECK(extensions); RTC_DCHECK(extensions);
rtc::UniqueNumberGenerator<int> unique_id_generator; extensions->erase(
unique_id_generator.AddKnownId(0); // The first valid RTP extension ID is 1. std::remove_if(extensions->begin(), extensions->end(),
for (const webrtc::RtpExtension& extension : *extensions) { [](auto extension) {
const bool collision_free = unique_id_generator.AddKnownId(extension.id); return extension.uri == webrtc::RtpExtension::kMidUri ||
RTC_DCHECK(collision_free); extension.uri == webrtc::RtpExtension::kRidUri ||
} extension.uri ==
webrtc::RtpExtension::kRepairedRidUri;
// Unified Plan also offers the MID and RID header extensions. }),
extensions->push_back(webrtc::RtpExtension(webrtc::RtpExtension::kMidUri, extensions->end());
unique_id_generator()));
extensions->push_back(webrtc::RtpExtension(webrtc::RtpExtension::kRidUri,
unique_id_generator()));
extensions->push_back(webrtc::RtpExtension(
webrtc::RtpExtension::kRepairedRidUri, unique_id_generator()));
} }
RtpHeaderExtensions RtpHeaderExtensions
MediaSessionDescriptionFactory::audio_rtp_header_extensions() const { MediaSessionDescriptionFactory::audio_rtp_header_extensions() const {
RtpHeaderExtensions extensions = audio_rtp_extensions_; RtpHeaderExtensions extensions = audio_rtp_extensions_;
if (is_unified_plan_) { if (!is_unified_plan_) {
AddUnifiedPlanExtensions(&extensions); RemoveUnifiedPlanExtensions(&extensions);
} }
return extensions; return extensions;
@ -1389,8 +1384,8 @@ MediaSessionDescriptionFactory::audio_rtp_header_extensions() const {
RtpHeaderExtensions RtpHeaderExtensions
MediaSessionDescriptionFactory::video_rtp_header_extensions() const { MediaSessionDescriptionFactory::video_rtp_header_extensions() const {
RtpHeaderExtensions extensions = video_rtp_extensions_; RtpHeaderExtensions extensions = video_rtp_extensions_;
if (is_unified_plan_) { if (!is_unified_plan_) {
AddUnifiedPlanExtensions(&extensions); RemoveUnifiedPlanExtensions(&extensions);
} }
return extensions; return extensions;

View File

@ -4441,50 +4441,6 @@ TEST_F(MediaSessionDescriptionFactoryTest, TestSetAudioCodecs) {
EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs()); EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs());
} }
// Checks that the RID extensions are added to the video RTP header extensions.
// Note: This test somewhat shows that |set_video_rtp_header_extensions()| is
// not very well defined, as calling set() and immediately get() will yield
// an object that is not semantically equivalent to the set object.
TEST_F(MediaSessionDescriptionFactoryTest, VideoHasRidExtensionsInUnifiedPlan) {
TransportDescriptionFactory tdf;
UniqueRandomIdGenerator ssrc_generator;
MediaSessionDescriptionFactory sf(&tdf, &ssrc_generator);
sf.set_is_unified_plan(true);
cricket::RtpHeaderExtensions extensions;
sf.set_video_rtp_header_extensions(extensions);
cricket::RtpHeaderExtensions result = sf.video_rtp_header_extensions();
// Check to see that RID extensions were added to the extension list
EXPECT_GE(result.size(), 2u);
EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kMidUri)));
EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kRidUri)));
EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kRepairedRidUri)));
}
// Checks that the RID extensions are added to the audio RTP header extensions.
// Note: This test somewhat shows that |set_audio_rtp_header_extensions()| is
// not very well defined, as calling set() and immediately get() will yield
// an object that is not semantically equivalent to the set object.
TEST_F(MediaSessionDescriptionFactoryTest, AudioHasRidExtensionsInUnifiedPlan) {
TransportDescriptionFactory tdf;
UniqueRandomIdGenerator ssrc_generator;
MediaSessionDescriptionFactory sf(&tdf, &ssrc_generator);
sf.set_is_unified_plan(true);
cricket::RtpHeaderExtensions extensions;
sf.set_audio_rtp_header_extensions(extensions);
cricket::RtpHeaderExtensions result = sf.audio_rtp_header_extensions();
// Check to see that RID extensions were added to the extension list
EXPECT_GE(result.size(), 2u);
EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kMidUri)));
EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kRidUri)));
EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kRepairedRidUri)));
}
namespace { namespace {
// Compare the two vectors of codecs ignoring the payload type. // Compare the two vectors of codecs ignoring the payload type.
template <class Codec> template <class Codec>