Create the SrtpTransportInterface.

Create the SrtpTransportInterface, a subclass of RtpTransportInterface, which
allows the user to set the send and receive keys. The functionalities are
implemented inside the RtpTransportAdapters on top of BaseChannel.

BUG=webrtc:7013

Review-Url: https://codereview.webrtc.org/2714813004
Cr-Commit-Position: refs/heads/master@{#17023}
diff --git a/webrtc/ortc/rtptransportadapter.h b/webrtc/ortc/rtptransportadapter.h
index 169ae61..59a123e 100644
--- a/webrtc/ortc/rtptransportadapter.h
+++ b/webrtc/ortc/rtptransportadapter.h
@@ -14,7 +14,7 @@
 #include <memory>
 #include <vector>
 
-#include "webrtc/api/ortc/rtptransportinterface.h"
+#include "webrtc/api/ortc/srtptransportinterface.h"
 #include "webrtc/api/rtcerror.h"
 #include "webrtc/base/constructormagic.h"
 #include "webrtc/base/sigslot.h"
@@ -24,13 +24,14 @@
 
 namespace webrtc {
 
-// Implementation of RtpTransportInterface to be used with RtpSenderAdapter,
-// RtpReceiverAdapter, and RtpTransportControllerAdapter classes.
+// Implementation of SrtpTransportInterface to be used with RtpSenderAdapter,
+// RtpReceiverAdapter, and RtpTransportControllerAdapter classes. This class
+// is used to implement both a secure and insecure RTP transport.
 //
 // TODO(deadbeef): When BaseChannel is split apart into separate
 // "RtpTransport"/"RtpTransceiver"/"RtpSender"/"RtpReceiver" objects, this
 // adapter object can be removed.
-class RtpTransportAdapter : public RtpTransportInterface {
+class RtpTransportAdapter : public SrtpTransportInterface {
  public:
   // |rtp| can't be null. |rtcp| can if RTCP muxing is used immediately (meaning
   // |rtcp_parameters.mux| is also true).
@@ -39,6 +40,13 @@
       PacketTransportInterface* rtp,
       PacketTransportInterface* rtcp,
       RtpTransportControllerAdapter* rtp_transport_controller);
+
+  static RTCErrorOr<std::unique_ptr<SrtpTransportInterface>> CreateSrtpProxied(
+      const RtcpParameters& rtcp_parameters,
+      PacketTransportInterface* rtp,
+      PacketTransportInterface* rtcp,
+      RtpTransportControllerAdapter* rtp_transport_controller);
+
   ~RtpTransportAdapter() override;
 
   // RtpTransportInterface implementation.
@@ -47,6 +55,10 @@
   RTCError SetRtcpParameters(const RtcpParameters& parameters) override;
   RtcpParameters GetRtcpParameters() const override { return rtcp_parameters_; }
 
+  // SRTP specific implementation.
+  RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override;
+  RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override;
+
   // Methods used internally by OrtcFactory.
   RtpTransportControllerAdapter* rtp_transport_controller() {
     return rtp_transport_controller_;
@@ -58,6 +70,14 @@
   // returning this transport from GetTransports().
   sigslot::signal1<RtpTransportAdapter*> SignalDestroyed;
 
+  // Used by the RtpTransportControllerAdapter to tell if an rtp sender or
+  // receiver can be created.
+  bool is_srtp_transport() { return is_srtp_transport_; }
+  // Used by the RtpTransportControllerAdapter to set keys for senders and
+  // receivers.
+  rtc::Optional<cricket::CryptoParams> send_key() { return send_key_; }
+  rtc::Optional<cricket::CryptoParams> receive_key() { return receive_key_; }
+
  protected:
   RtpTransportAdapter* GetInternal() override { return this; }
 
@@ -65,7 +85,8 @@
   RtpTransportAdapter(const RtcpParameters& rtcp_parameters,
                       PacketTransportInterface* rtp,
                       PacketTransportInterface* rtcp,
-                      RtpTransportControllerAdapter* rtp_transport_controller);
+                      RtpTransportControllerAdapter* rtp_transport_controller,
+                      bool is_srtp_transport);
 
   PacketTransportInterface* rtp_packet_transport_;
   PacketTransportInterface* rtcp_packet_transport_;
@@ -75,6 +96,11 @@
       owned_rtp_transport_controller_;
   RtcpParameters rtcp_parameters_;
 
+  // SRTP specific members.
+  rtc::Optional<cricket::CryptoParams> send_key_;
+  rtc::Optional<cricket::CryptoParams> receive_key_;
+  bool is_srtp_transport_;
+
   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpTransportAdapter);
 };