|  | /* | 
|  | *  Copyright 2024 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. | 
|  | */ | 
|  |  | 
|  | #ifndef CALL_PAYLOAD_TYPE_H_ | 
|  | #define CALL_PAYLOAD_TYPE_H_ | 
|  |  | 
|  | #include <cstdint> | 
|  | #include <string> | 
|  |  | 
|  | #include "api/rtc_error.h" | 
|  | #include "media/base/codec.h" | 
|  | #include "rtc_base/strong_alias.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | class PayloadType : public StrongAlias<class PayloadTypeTag, uint8_t> { | 
|  | public: | 
|  | // Non-explicit conversions from and to ints are to be deprecated and | 
|  | // removed once calling code is upgraded. | 
|  | PayloadType(uint8_t pt) { value_ = pt; }                // NOLINT: explicit | 
|  | constexpr operator uint8_t() const& { return value_; }  // NOLINT: Explicit | 
|  | static bool IsValid(PayloadType id, bool rtcp_mux) { | 
|  | // A payload type is a 7-bit value in the RTP header, so max = 127. | 
|  | // If RTCP multiplexing is used, the numbers from 64 to 95 are reserved | 
|  | // for RTCP packets. | 
|  | if (rtcp_mux && (id > 63 && id < 96)) { | 
|  | return false; | 
|  | } | 
|  | return id >= 0 && id <= 127; | 
|  | } | 
|  | template <typename Sink> | 
|  | friend void AbslStringify(Sink& sink, const PayloadType pt) { | 
|  | absl::Format(&sink, "%d", pt.value_); | 
|  | } | 
|  | }; | 
|  |  | 
|  | class PayloadTypeSuggester { | 
|  | public: | 
|  | virtual ~PayloadTypeSuggester() = default; | 
|  |  | 
|  | // Suggest a payload type for a given codec on a given media section. | 
|  | // Media section is indicated by MID. | 
|  | // The function will either return a PT already in use on the connection | 
|  | // or a newly suggested one. | 
|  | virtual RTCErrorOr<PayloadType> SuggestPayloadType(const std::string& mid, | 
|  | Codec codec) = 0; | 
|  | // Register a payload type as mapped to a specific codec for this MID | 
|  | // at this time. | 
|  | virtual RTCError AddLocalMapping(const std::string& mid, | 
|  | PayloadType payload_type, | 
|  | const Codec& codec) = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // CALL_PAYLOAD_TYPE_H_ |