|  | /* | 
|  | *  Copyright 2017 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 "pc/rtp_media_utils.h" | 
|  |  | 
|  | #include "rtc_base/checks.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | RtpTransceiverDirection RtpTransceiverDirectionFromSendRecv(bool send, | 
|  | bool recv) { | 
|  | if (send && recv) { | 
|  | return RtpTransceiverDirection::kSendRecv; | 
|  | } else if (send && !recv) { | 
|  | return RtpTransceiverDirection::kSendOnly; | 
|  | } else if (!send && recv) { | 
|  | return RtpTransceiverDirection::kRecvOnly; | 
|  | } else { | 
|  | return RtpTransceiverDirection::kInactive; | 
|  | } | 
|  | } | 
|  |  | 
|  | bool RtpTransceiverDirectionHasSend(RtpTransceiverDirection direction) { | 
|  | return direction == RtpTransceiverDirection::kSendRecv || | 
|  | direction == RtpTransceiverDirection::kSendOnly; | 
|  | } | 
|  |  | 
|  | bool RtpTransceiverDirectionHasRecv(RtpTransceiverDirection direction) { | 
|  | return direction == RtpTransceiverDirection::kSendRecv || | 
|  | direction == RtpTransceiverDirection::kRecvOnly; | 
|  | } | 
|  |  | 
|  | RtpTransceiverDirection RtpTransceiverDirectionReversed( | 
|  | RtpTransceiverDirection direction) { | 
|  | switch (direction) { | 
|  | case RtpTransceiverDirection::kSendRecv: | 
|  | case RtpTransceiverDirection::kInactive: | 
|  | case RtpTransceiverDirection::kStopped: | 
|  | return direction; | 
|  | case RtpTransceiverDirection::kSendOnly: | 
|  | return RtpTransceiverDirection::kRecvOnly; | 
|  | case RtpTransceiverDirection::kRecvOnly: | 
|  | return RtpTransceiverDirection::kSendOnly; | 
|  | default: | 
|  | RTC_DCHECK_NOTREACHED(); | 
|  | return direction; | 
|  | } | 
|  | } | 
|  |  | 
|  | RtpTransceiverDirection RtpTransceiverDirectionWithSendSet( | 
|  | RtpTransceiverDirection direction, | 
|  | bool send) { | 
|  | return RtpTransceiverDirectionFromSendRecv( | 
|  | send, RtpTransceiverDirectionHasRecv(direction)); | 
|  | } | 
|  |  | 
|  | RtpTransceiverDirection RtpTransceiverDirectionWithRecvSet( | 
|  | RtpTransceiverDirection direction, | 
|  | bool recv) { | 
|  | return RtpTransceiverDirectionFromSendRecv( | 
|  | RtpTransceiverDirectionHasSend(direction), recv); | 
|  | } | 
|  |  | 
|  | const char* RtpTransceiverDirectionToString(RtpTransceiverDirection direction) { | 
|  | switch (direction) { | 
|  | case RtpTransceiverDirection::kSendRecv: | 
|  | return "kSendRecv"; | 
|  | case RtpTransceiverDirection::kSendOnly: | 
|  | return "kSendOnly"; | 
|  | case RtpTransceiverDirection::kRecvOnly: | 
|  | return "kRecvOnly"; | 
|  | case RtpTransceiverDirection::kInactive: | 
|  | return "kInactive"; | 
|  | case RtpTransceiverDirection::kStopped: | 
|  | return "kStopped"; | 
|  | } | 
|  | RTC_DCHECK_NOTREACHED(); | 
|  | return ""; | 
|  | } | 
|  |  | 
|  | RtpTransceiverDirection RtpTransceiverDirectionIntersection( | 
|  | RtpTransceiverDirection lhs, | 
|  | RtpTransceiverDirection rhs) { | 
|  | return RtpTransceiverDirectionFromSendRecv( | 
|  | RtpTransceiverDirectionHasSend(lhs) && | 
|  | RtpTransceiverDirectionHasSend(rhs), | 
|  | RtpTransceiverDirectionHasRecv(lhs) && | 
|  | RtpTransceiverDirectionHasRecv(rhs)); | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |