Injects FrameEncryptorInterface into RtpSender.
This change injects the FrameEncryptorInterface and the FrameDecryptorInterface
into the RtpSenderInterface and RtpReceiverInterface respectively. This is the
second stage of the injection. In a follow up CL non owning pointers to these
values will be passed down into the media channel.
This change also updates the corresponding mock files.
Bug: webrtc:9681
Change-Id: I964084fc270e10af9d1127979e713493e6fbba7d
Reviewed-on: https://webrtc-review.googlesource.com/96625
Commit-Queue: Benjamin Wright <benwright@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24489}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 79d5271..14faff80 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -86,6 +86,7 @@
"rtpparameters.h",
"rtpreceiverinterface.cc",
"rtpreceiverinterface.h",
+ "rtpsenderinterface.cc",
"rtpsenderinterface.h",
"rtptransceiverinterface.cc",
"rtptransceiverinterface.h",
diff --git a/api/crypto/framedecryptorinterface.h b/api/crypto/framedecryptorinterface.h
index 7a36685..a3ff19a 100644
--- a/api/crypto/framedecryptorinterface.h
+++ b/api/crypto/framedecryptorinterface.h
@@ -29,7 +29,7 @@
// This interface is not ready for production use.
class FrameDecryptorInterface : public rtc::RefCountInterface {
public:
- virtual ~FrameDecryptorInterface() {}
+ ~FrameDecryptorInterface() override {}
// Attempts to decrypt the encrypted frame. You may assume the frame size will
// be allocated to the size returned from GetOutputSize. You may assume that
diff --git a/api/crypto/frameencryptorinterface.h b/api/crypto/frameencryptorinterface.h
index 6c448a1..369d6b8 100644
--- a/api/crypto/frameencryptorinterface.h
+++ b/api/crypto/frameencryptorinterface.h
@@ -27,7 +27,7 @@
// This interface is not ready for production use.
class FrameEncryptorInterface : public rtc::RefCountInterface {
public:
- virtual ~FrameEncryptorInterface() {}
+ ~FrameEncryptorInterface() override {}
// Attempts to encrypt the provided frame. You may assume the encrypted_frame
// will match the size returned by GetOutputSize for a give frame. You may
diff --git a/api/rtpreceiverinterface.cc b/api/rtpreceiverinterface.cc
index fcdca69..216ed2e 100644
--- a/api/rtpreceiverinterface.cc
+++ b/api/rtpreceiverinterface.cc
@@ -45,4 +45,12 @@
return {};
}
+void RtpReceiverInterface::SetFrameDecryptor(
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) {}
+
+rtc::scoped_refptr<FrameDecryptorInterface>
+RtpReceiverInterface::GetFrameDecryptor() const {
+ return nullptr;
+}
+
} // namespace webrtc
diff --git a/api/rtpreceiverinterface.h b/api/rtpreceiverinterface.h
index b2499b4..266f6ac 100644
--- a/api/rtpreceiverinterface.h
+++ b/api/rtpreceiverinterface.h
@@ -17,6 +17,7 @@
#include <string>
#include <vector>
+#include "api/crypto/framedecryptorinterface.h"
#include "api/mediastreaminterface.h"
#include "api/mediatypes.h"
#include "api/proxy.h"
@@ -124,6 +125,17 @@
// content::FakeRtpReceiver in Chromium.
virtual std::vector<RtpSource> GetSources() const;
+ // Sets a user defined frame decryptor that will decrypt the entire frame
+ // before it is sent across the network. This will decrypt the entire frame
+ // using the user provided decryption mechanism regardless of whether SRTP is
+ // enabled or not.
+ virtual void SetFrameDecryptor(
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor);
+
+ // Returns a pointer to the frame decryptor set previously by the
+ // user. This can be used to update the state of the object.
+ virtual rtc::scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor() const;
+
protected:
~RtpReceiverInterface() override = default;
};
@@ -142,6 +154,11 @@
PROXY_METHOD1(bool, SetParameters, const RtpParameters&)
PROXY_METHOD1(void, SetObserver, RtpReceiverObserverInterface*);
PROXY_CONSTMETHOD0(std::vector<RtpSource>, GetSources);
+PROXY_METHOD1(void,
+ SetFrameDecryptor,
+ rtc::scoped_refptr<FrameDecryptorInterface>);
+PROXY_CONSTMETHOD0(rtc::scoped_refptr<FrameDecryptorInterface>,
+ GetFrameDecryptor);
END_PROXY_MAP()
} // namespace webrtc
diff --git a/api/rtpsenderinterface.cc b/api/rtpsenderinterface.cc
new file mode 100644
index 0000000..bbf3901
--- /dev/null
+++ b/api/rtpsenderinterface.cc
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2018 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "api/rtpsenderinterface.h"
+
+namespace webrtc {
+
+void RtpSenderInterface::SetFrameEncryptor(
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {}
+
+rtc::scoped_refptr<FrameEncryptorInterface>
+RtpSenderInterface::GetFrameEncryptor() const {
+ return nullptr;
+}
+
+} // namespace webrtc
diff --git a/api/rtpsenderinterface.h b/api/rtpsenderinterface.h
index a7eec49..96c2669 100644
--- a/api/rtpsenderinterface.h
+++ b/api/rtpsenderinterface.h
@@ -17,6 +17,7 @@
#include <string>
#include <vector>
+#include "api/crypto/frameencryptorinterface.h"
#include "api/dtmfsenderinterface.h"
#include "api/mediastreaminterface.h"
#include "api/mediatypes.h"
@@ -63,6 +64,17 @@
// Returns null for a video sender.
virtual rtc::scoped_refptr<DtmfSenderInterface> GetDtmfSender() const = 0;
+ // Sets a user defined frame encryptor that will encrypt the entire frame
+ // before it is sent across the network. This will encrypt the entire frame
+ // using the user provided encryption mechanism regardless of whether SRTP is
+ // enabled or not.
+ virtual void SetFrameEncryptor(
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor);
+
+ // Returns a pointer to the frame encryptor set previously by the
+ // user. This can be used to update the state of the object.
+ virtual rtc::scoped_refptr<FrameEncryptorInterface> GetFrameEncryptor() const;
+
protected:
~RtpSenderInterface() override = default;
};
@@ -81,6 +93,11 @@
PROXY_METHOD0(RtpParameters, GetParameters);
PROXY_METHOD1(RTCError, SetParameters, const RtpParameters&)
PROXY_CONSTMETHOD0(rtc::scoped_refptr<DtmfSenderInterface>, GetDtmfSender);
+PROXY_METHOD1(void,
+ SetFrameEncryptor,
+ rtc::scoped_refptr<FrameEncryptorInterface>);
+PROXY_CONSTMETHOD0(rtc::scoped_refptr<FrameEncryptorInterface>,
+ GetFrameEncryptor);
END_PROXY_MAP()
} // namespace webrtc
diff --git a/pc/rtpreceiver.cc b/pc/rtpreceiver.cc
index da2f81b..3d20d09 100644
--- a/pc/rtpreceiver.cc
+++ b/pc/rtpreceiver.cc
@@ -138,6 +138,16 @@
});
}
+void AudioRtpReceiver::SetFrameDecryptor(
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) {
+ frame_decryptor_ = std::move(frame_decryptor);
+}
+
+rtc::scoped_refptr<FrameDecryptorInterface>
+AudioRtpReceiver::GetFrameDecryptor() const {
+ return frame_decryptor_;
+}
+
void AudioRtpReceiver::Stop() {
// TODO(deadbeef): Need to do more here to fully stop receiving packets.
if (stopped_) {
@@ -308,6 +318,16 @@
});
}
+void VideoRtpReceiver::SetFrameDecryptor(
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) {
+ frame_decryptor_ = std::move(frame_decryptor);
+}
+
+rtc::scoped_refptr<FrameDecryptorInterface>
+VideoRtpReceiver::GetFrameDecryptor() const {
+ return frame_decryptor_;
+}
+
void VideoRtpReceiver::Stop() {
// TODO(deadbeef): Need to do more here to fully stop receiving packets.
if (stopped_) {
diff --git a/pc/rtpreceiver.h b/pc/rtpreceiver.h
index 263ad94..e22e5a9 100644
--- a/pc/rtpreceiver.h
+++ b/pc/rtpreceiver.h
@@ -115,6 +115,12 @@
RtpParameters GetParameters() const override;
bool SetParameters(const RtpParameters& parameters) override;
+ void SetFrameDecryptor(
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) override;
+
+ rtc::scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor()
+ const override;
+
// RtpReceiverInternal implementation.
void Stop() override;
void SetupMediaChannel(uint32_t ssrc) override;
@@ -155,6 +161,7 @@
RtpReceiverObserverInterface* observer_ = nullptr;
bool received_first_packet_ = false;
int attachment_id_ = 0;
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor_;
};
class VideoRtpReceiver : public rtc::RefCountedObject<RtpReceiverInternal> {
@@ -196,6 +203,12 @@
RtpParameters GetParameters() const override;
bool SetParameters(const RtpParameters& parameters) override;
+ void SetFrameDecryptor(
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) override;
+
+ rtc::scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor()
+ const override;
+
// RtpReceiverInternal implementation.
void Stop() override;
void SetupMediaChannel(uint32_t ssrc) override;
@@ -250,6 +263,7 @@
RtpReceiverObserverInterface* observer_ = nullptr;
bool received_first_packet_ = false;
int attachment_id_ = 0;
+ rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor_;
};
} // namespace webrtc
diff --git a/pc/rtpsender.cc b/pc/rtpsender.cc
index 91708fa..2a7eca5 100644
--- a/pc/rtpsender.cc
+++ b/pc/rtpsender.cc
@@ -10,6 +10,7 @@
#include "pc/rtpsender.h"
+#include <utility>
#include <vector>
#include "api/mediastreaminterface.h"
@@ -273,6 +274,16 @@
return dtmf_sender_proxy_;
}
+void AudioRtpSender::SetFrameEncryptor(
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
+ frame_encryptor_ = std::move(frame_encryptor);
+}
+
+rtc::scoped_refptr<FrameEncryptorInterface> AudioRtpSender::GetFrameEncryptor()
+ const {
+ return frame_encryptor_;
+}
+
void AudioRtpSender::SetSsrc(uint32_t ssrc) {
TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc");
if (stopped_ || ssrc == ssrc_) {
@@ -469,6 +480,16 @@
return nullptr;
}
+void VideoRtpSender::SetFrameEncryptor(
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
+ frame_encryptor_ = std::move(frame_encryptor);
+}
+
+rtc::scoped_refptr<FrameEncryptorInterface> VideoRtpSender::GetFrameEncryptor()
+ const {
+ return frame_encryptor_;
+}
+
void VideoRtpSender::SetSsrc(uint32_t ssrc) {
TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc");
if (stopped_ || ssrc == ssrc_) {
diff --git a/pc/rtpsender.h b/pc/rtpsender.h
index 983bb20..ddef2d8 100644
--- a/pc/rtpsender.h
+++ b/pc/rtpsender.h
@@ -127,6 +127,12 @@
rtc::scoped_refptr<DtmfSenderInterface> GetDtmfSender() const override;
+ void SetFrameEncryptor(
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
+
+ rtc::scoped_refptr<FrameEncryptorInterface> GetFrameEncryptor()
+ const override;
+
// RtpSenderInternal implementation.
void SetSsrc(uint32_t ssrc) override;
@@ -175,6 +181,7 @@
// cricket::AudioSource.
std::unique_ptr<LocalAudioSinkAdapter> sink_adapter_;
int attachment_id_ = 0;
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
};
class VideoRtpSender : public ObserverInterface,
@@ -210,6 +217,12 @@
rtc::scoped_refptr<DtmfSenderInterface> GetDtmfSender() const override;
+ void SetFrameEncryptor(
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
+
+ rtc::scoped_refptr<FrameEncryptorInterface> GetFrameEncryptor()
+ const override;
+
// RtpSenderInternal implementation.
void SetSsrc(uint32_t ssrc) override;
@@ -248,6 +261,7 @@
VideoTrackInterface::ContentHint::kNone;
bool stopped_ = false;
int attachment_id_ = 0;
+ rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
};
} // namespace webrtc
diff --git a/pc/test/mock_rtpreceiverinternal.h b/pc/test/mock_rtpreceiverinternal.h
index 8b12e8f..850d5a9 100644
--- a/pc/test/mock_rtpreceiverinternal.h
+++ b/pc/test/mock_rtpreceiverinternal.h
@@ -34,6 +34,10 @@
MOCK_METHOD1(SetParameters, bool(const RtpParameters&));
MOCK_METHOD1(SetObserver, void(RtpReceiverObserverInterface*));
MOCK_CONST_METHOD0(GetSources, std::vector<RtpSource>());
+ MOCK_METHOD1(SetFrameDecryptor,
+ void(rtc::scoped_refptr<FrameDecryptorInterface>));
+ MOCK_CONST_METHOD0(GetFrameDecryptor,
+ rtc::scoped_refptr<FrameDecryptorInterface>());
// RtpReceiverInternal methods.
MOCK_METHOD0(Stop, void());
diff --git a/pc/test/mock_rtpsenderinternal.h b/pc/test/mock_rtpsenderinternal.h
index 3ddffec..8e2bf73 100644
--- a/pc/test/mock_rtpsenderinternal.h
+++ b/pc/test/mock_rtpsenderinternal.h
@@ -32,6 +32,10 @@
MOCK_METHOD0(GetParameters, RtpParameters());
MOCK_METHOD1(SetParameters, RTCError(const RtpParameters&));
MOCK_CONST_METHOD0(GetDtmfSender, rtc::scoped_refptr<DtmfSenderInterface>());
+ MOCK_METHOD1(SetFrameEncryptor,
+ void(rtc::scoped_refptr<FrameEncryptorInterface>));
+ MOCK_CONST_METHOD0(GetFrameEncryptor,
+ rtc::scoped_refptr<FrameEncryptorInterface>());
// RtpSenderInternal methods.
MOCK_METHOD1(SetVoiceMediaChannel, void(cricket::VoiceMediaChannel*));