diff options
author | Minyue Li <minyue@chromium.org> | 2020-03-10 10:59:37 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-10 22:25:15 +0000 |
commit | 430e4a09e0ca66a9680cd9884a90ca5b4346bcd7 (patch) | |
tree | 783883e0abc60d59188972699e534adb69538cbf /pc | |
parent | 8332950f4a885f8c47405e75c5a83af04c58b078 (diff) | |
download | webrtc-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.cc | 13 | ||||
-rw-r--r-- | pc/media_session_unittest.cc | 75 |
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); |