Remove cricket::RtpTransceiverDirection

Replaces cricket::RtpTransceiverDirection with
webrtc::RtpTransceiverDirection, which is part of the public API.

Bug: webrtc:8558
Change-Id: Ibfc9373e25187e98fb969e7ac937a1371c8fa4c7
Reviewed-on: https://webrtc-review.googlesource.com/24129
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Peter Thatcher <pthatcher@webrtc.org>
Reviewed-by: Zhi Huang <zhihuang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20899}
diff --git a/pc/mediasession.cc b/pc/mediasession.cc
index e9b4c73..9c31f50 100644
--- a/pc/mediasession.cc
+++ b/pc/mediasession.cc
@@ -25,6 +25,7 @@
 #include "media/base/mediaconstants.h"
 #include "p2p/base/p2pconstants.h"
 #include "pc/channelmanager.h"
+#include "pc/rtpmediautils.h"
 #include "pc/srtpfilter.h"
 #include "rtc_base/base64.h"
 #include "rtc_base/checks.h"
@@ -33,6 +34,9 @@
 #include "rtc_base/stringutils.h"
 
 namespace {
+
+using webrtc::RtpTransceiverDirection;
+
 const char kInline[] = "inline:";
 
 void GetSupportedSdesCryptoSuiteNames(void (*func)(const rtc::CryptoOptions&,
@@ -97,30 +101,47 @@
   return IsPlainSctp(protocol) || IsDtlsSctp(protocol);
 }
 
-RtpTransceiverDirection RtpTransceiverDirection::FromMediaContentDirection(
-    MediaContentDirection md) {
-  const bool send = (md == MD_SENDRECV || md == MD_SENDONLY);
-  const bool recv = (md == MD_SENDRECV || md == MD_RECVONLY);
-  return RtpTransceiverDirection(send, recv);
+RtpTransceiverDirection RtpTransceiverDirectionFromMediaContentDirection(
+    MediaContentDirection direction) {
+  switch (direction) {
+    case MD_SENDRECV:
+      return RtpTransceiverDirection::kSendRecv;
+    case MD_SENDONLY:
+      return RtpTransceiverDirection::kSendOnly;
+    case MD_RECVONLY:
+      return RtpTransceiverDirection::kRecvOnly;
+    case MD_INACTIVE:
+      return RtpTransceiverDirection::kInactive;
+  }
+  RTC_NOTREACHED();
+  return RtpTransceiverDirection::kInactive;
 }
 
-MediaContentDirection RtpTransceiverDirection::ToMediaContentDirection() const {
-  if (send && recv) {
-    return MD_SENDRECV;
-  } else if (send) {
-    return MD_SENDONLY;
-  } else if (recv) {
-    return MD_RECVONLY;
+MediaContentDirection MediaContentDirectionFromRtpTransceiverDirection(
+    RtpTransceiverDirection direction) {
+  switch (direction) {
+    case RtpTransceiverDirection::kSendRecv:
+      return MD_SENDRECV;
+    case RtpTransceiverDirection::kSendOnly:
+      return MD_SENDONLY;
+    case RtpTransceiverDirection::kRecvOnly:
+      return MD_RECVONLY;
+    case RtpTransceiverDirection::kInactive:
+      return MD_INACTIVE;
   }
-
+  RTC_NOTREACHED();
   return MD_INACTIVE;
 }
 
-RtpTransceiverDirection
-NegotiateRtpTransceiverDirection(RtpTransceiverDirection offer,
-                                 RtpTransceiverDirection wants) {
-  return RtpTransceiverDirection(offer.recv && wants.send,
-                                 offer.send && wants.recv);
+static RtpTransceiverDirection NegotiateRtpTransceiverDirection(
+    RtpTransceiverDirection offer,
+    RtpTransceiverDirection wants) {
+  bool offer_send = webrtc::RtpTransceiverDirectionHasSend(offer);
+  bool offer_recv = webrtc::RtpTransceiverDirectionHasRecv(offer);
+  bool wants_send = webrtc::RtpTransceiverDirectionHasSend(wants);
+  bool wants_recv = webrtc::RtpTransceiverDirectionHasRecv(wants);
+  return webrtc::RtpTransceiverDirectionFromSendRecv(offer_recv && wants_send,
+                                                     offer_send && wants_recv);
 }
 
 static bool IsMediaContentOfType(const ContentInfo* content,
@@ -1156,11 +1177,12 @@
   }
 
   auto offer_rtd =
-      RtpTransceiverDirection::FromMediaContentDirection(offer->direction());
+      RtpTransceiverDirectionFromMediaContentDirection(offer->direction());
 
-  answer->set_direction(NegotiateRtpTransceiverDirection(
-                            offer_rtd, media_description_options.direction)
-                            .ToMediaContentDirection());
+  answer->set_direction(
+      cricket::MediaContentDirectionFromRtpTransceiverDirection(
+          NegotiateRtpTransceiverDirection(
+              offer_rtd, media_description_options.direction)));
   return true;
 }
 
@@ -1569,34 +1591,37 @@
 
 const AudioCodecs& MediaSessionDescriptionFactory::GetAudioCodecsForOffer(
     const RtpTransceiverDirection& direction) const {
-  // If stream is inactive - generate list as if sendrecv.
-  if (direction.send == direction.recv) {
-    return audio_sendrecv_codecs_;
-  } else if (direction.send) {
-    return audio_send_codecs_;
-  } else {
-    return audio_recv_codecs_;
+  switch (direction) {
+    // If stream is inactive - generate list as if sendrecv.
+    case RtpTransceiverDirection::kSendRecv:
+    case RtpTransceiverDirection::kInactive:
+      return audio_sendrecv_codecs_;
+    case RtpTransceiverDirection::kSendOnly:
+      return audio_send_codecs_;
+    case RtpTransceiverDirection::kRecvOnly:
+      return audio_recv_codecs_;
   }
+  RTC_NOTREACHED();
+  return audio_sendrecv_codecs_;
 }
 
 const AudioCodecs& MediaSessionDescriptionFactory::GetAudioCodecsForAnswer(
     const RtpTransceiverDirection& offer,
     const RtpTransceiverDirection& answer) const {
-  // For inactive and sendrecv answers, generate lists as if we were to accept
-  // the offer's direction. See RFC 3264 Section 6.1.
-  if (answer.send == answer.recv) {
-    if (offer.send == offer.recv) {
-      return audio_sendrecv_codecs_;
-    } else if (offer.send) {
-      return audio_recv_codecs_;
-    } else {
+  switch (answer) {
+    // For inactive and sendrecv answers, generate lists as if we were to accept
+    // the offer's direction. See RFC 3264 Section 6.1.
+    case RtpTransceiverDirection::kSendRecv:
+    case RtpTransceiverDirection::kInactive:
+      return GetAudioCodecsForOffer(
+          webrtc::RtpTransceiverDirectionReversed(offer));
+    case RtpTransceiverDirection::kSendOnly:
       return audio_send_codecs_;
-    }
-  } else if (answer.send) {
-    return audio_send_codecs_;
-  } else {
-    return audio_recv_codecs_;
+    case RtpTransceiverDirection::kRecvOnly:
+      return audio_recv_codecs_;
   }
+  RTC_NOTREACHED();
+  return audio_sendrecv_codecs_;
 }
 
 void MergeCodecsFromDescription(const SessionDescription* description,
@@ -1908,7 +1933,8 @@
   SetMediaProtocol(secure_transport, audio.get());
 
   audio->set_direction(
-      media_description_options.direction.ToMediaContentDirection());
+      cricket::MediaContentDirectionFromRtpTransceiverDirection(
+          media_description_options.direction));
 
   desc->AddContent(media_description_options.mid, NS_JINGLE_RTP,
                    media_description_options.stopped, audio.release());
@@ -1979,7 +2005,8 @@
   SetMediaProtocol(secure_transport, video.get());
 
   video->set_direction(
-      media_description_options.direction.ToMediaContentDirection());
+      cricket::MediaContentDirectionFromRtpTransceiverDirection(
+          media_description_options.direction));
 
   desc->AddContent(media_description_options.mid, NS_JINGLE_RTP,
                    media_description_options.stopped, video.release());
@@ -2098,7 +2125,7 @@
   // and the selected direction in the answer.
   // Note these will be filtered one final time in CreateMediaContentAnswer.
   auto wants_rtd = media_description_options.direction;
-  auto offer_rtd = RtpTransceiverDirection::FromMediaContentDirection(
+  auto offer_rtd = RtpTransceiverDirectionFromMediaContentDirection(
       offer_audio_description->direction());
   auto answer_rtd = NegotiateRtpTransceiverDirection(offer_rtd, wants_rtd);
   AudioCodecs supported_audio_codecs =