aboutsummaryrefslogtreecommitdiff
path: root/pc
diff options
context:
space:
mode:
authorMinyue Li <minyue@chromium.org>2020-03-10 10:59:37 +0100
committerCommit Bot <commit-bot@chromium.org>2020-03-10 22:25:15 +0000
commit430e4a09e0ca66a9680cd9884a90ca5b4346bcd7 (patch)
tree783883e0abc60d59188972699e534adb69538cbf /pc
parent8332950f4a885f8c47405e75c5a83af04c58b078 (diff)
downloadwebrtc-430e4a09e0ca66a9680cd9884a90ca5b4346bcd7.tar.gz
Allow to negotiate absolute capture time rtp header extension.
Bug: webrtc:10739 Change-Id: I239d67a8c02bcc4175b142174b254e876bdd8d6d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/169920 Commit-Queue: Minyue Li <minyue@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30746}
Diffstat (limited to 'pc')
-rw-r--r--pc/media_session.cc13
-rw-r--r--pc/media_session_unittest.cc75
2 files changed, 88 insertions, 0 deletions
diff --git a/pc/media_session.cc b/pc/media_session.cc
index 05c421ed51..110258d2b3 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -1075,11 +1075,15 @@ static void NegotiateRtpHeaderExtensions(
bool frame_descriptor_in_local = false;
bool dependency_descriptor_in_local = false;
+ bool abs_capture_time_in_local = false;
+
for (const webrtc::RtpExtension& ours : local_extensions) {
if (ours.uri == webrtc::RtpExtension::kGenericFrameDescriptorUri00)
frame_descriptor_in_local = true;
else if (ours.uri == webrtc::RtpExtension::kDependencyDescriptorUri)
dependency_descriptor_in_local = true;
+ else if (ours.uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri)
+ abs_capture_time_in_local = true;
webrtc::RtpExtension theirs;
if (FindByUriWithEncryptionPreference(
offered_extensions, ours.uri,
@@ -1119,6 +1123,15 @@ static void NegotiateRtpHeaderExtensions(
enable_encrypted_rtp_header_extensions, &theirs)) {
negotiated_extensions->push_back(theirs);
}
+
+ // Absolute capture time support. If the extension is not present locally, but
+ // is in the offer, we add it to the list.
+ if (!abs_capture_time_in_local &&
+ FindByUriWithEncryptionPreference(
+ offered_extensions, webrtc::RtpExtension::kAbsoluteCaptureTimeUri,
+ enable_encrypted_rtp_header_extensions, &theirs)) {
+ negotiated_extensions->push_back(theirs);
+ }
}
static void StripCNCodecs(AudioCodecs* audio_codecs) {
diff --git a/pc/media_session_unittest.cc b/pc/media_session_unittest.cc
index b217051054..41e2767601 100644
--- a/pc/media_session_unittest.cc
+++ b/pc/media_session_unittest.cc
@@ -1757,6 +1757,81 @@ TEST_F(MediaSessionDescriptionFactoryTest,
}
TEST_F(MediaSessionDescriptionFactoryTest,
+ NegotiateAbsoluteCaptureTimeWhenUnexposedLocally) {
+ MediaSessionOptions opts;
+ AddAudioVideoSections(RtpTransceiverDirection::kRecvOnly, &opts);
+
+ const cricket::RtpHeaderExtensions offered_extensions = {
+ RtpExtension(RtpExtension::kAbsoluteCaptureTimeUri, 7)};
+ const cricket::RtpHeaderExtensions local_extensions = {
+ RtpExtension(RtpExtension::kTransportSequenceNumberUri, 5)};
+ f1_.set_video_rtp_header_extensions(offered_extensions);
+ f1_.set_audio_rtp_header_extensions(offered_extensions);
+ f2_.set_video_rtp_header_extensions(local_extensions);
+ f2_.set_audio_rtp_header_extensions(local_extensions);
+
+ std::unique_ptr<SessionDescription> offer = f1_.CreateOffer(opts, nullptr);
+ std::unique_ptr<SessionDescription> answer =
+ f2_.CreateAnswer(offer.get(), opts, nullptr);
+ EXPECT_THAT(
+ GetFirstVideoContentDescription(answer.get())->rtp_header_extensions(),
+ ElementsAreArray(offered_extensions));
+ EXPECT_THAT(
+ GetFirstAudioContentDescription(answer.get())->rtp_header_extensions(),
+ ElementsAreArray(offered_extensions));
+}
+
+TEST_F(MediaSessionDescriptionFactoryTest,
+ NegotiateAbsoluteCaptureTimeWhenExposedLocally) {
+ MediaSessionOptions opts;
+ AddAudioVideoSections(RtpTransceiverDirection::kRecvOnly, &opts);
+
+ const cricket::RtpHeaderExtensions offered_extensions = {
+ RtpExtension(RtpExtension::kAbsoluteCaptureTimeUri, 7)};
+ const cricket::RtpHeaderExtensions local_extensions = {
+ RtpExtension(RtpExtension::kAbsoluteCaptureTimeUri, 5)};
+ f1_.set_video_rtp_header_extensions(offered_extensions);
+ f1_.set_audio_rtp_header_extensions(offered_extensions);
+ f2_.set_video_rtp_header_extensions(local_extensions);
+ f2_.set_audio_rtp_header_extensions(local_extensions);
+
+ std::unique_ptr<SessionDescription> offer = f1_.CreateOffer(opts, nullptr);
+ std::unique_ptr<SessionDescription> answer =
+ f2_.CreateAnswer(offer.get(), opts, nullptr);
+ EXPECT_THAT(
+ GetFirstVideoContentDescription(answer.get())->rtp_header_extensions(),
+ ElementsAreArray(offered_extensions));
+ EXPECT_THAT(
+ GetFirstAudioContentDescription(answer.get())->rtp_header_extensions(),
+ ElementsAreArray(offered_extensions));
+}
+
+TEST_F(MediaSessionDescriptionFactoryTest,
+ DoNotNegotiateAbsoluteCaptureTimeWhenNotOffered) {
+ MediaSessionOptions opts;
+ AddAudioVideoSections(RtpTransceiverDirection::kRecvOnly, &opts);
+
+ const cricket::RtpHeaderExtensions offered_extensions = {
+ RtpExtension(RtpExtension::kTransportSequenceNumberUri, 7)};
+ const cricket::RtpHeaderExtensions local_extensions = {
+ RtpExtension(RtpExtension::kAbsoluteCaptureTimeUri, 5)};
+ f1_.set_video_rtp_header_extensions(offered_extensions);
+ f1_.set_audio_rtp_header_extensions(offered_extensions);
+ f2_.set_video_rtp_header_extensions(local_extensions);
+ f2_.set_audio_rtp_header_extensions(local_extensions);
+
+ std::unique_ptr<SessionDescription> offer = f1_.CreateOffer(opts, nullptr);
+ std::unique_ptr<SessionDescription> answer =
+ f2_.CreateAnswer(offer.get(), opts, nullptr);
+ EXPECT_THAT(
+ GetFirstVideoContentDescription(answer.get())->rtp_header_extensions(),
+ IsEmpty());
+ EXPECT_THAT(
+ GetFirstAudioContentDescription(answer.get())->rtp_header_extensions(),
+ IsEmpty());
+}
+
+TEST_F(MediaSessionDescriptionFactoryTest,
TestOfferAnswerWithEncryptedRtpExtensionsBoth) {
MediaSessionOptions opts;
AddAudioVideoSections(RtpTransceiverDirection::kRecvOnly, &opts);