/* * Copyright (c) 2023 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 API_VIDEO_CODECS_H265_PROFILE_TIER_LEVEL_H_ #define API_VIDEO_CODECS_H265_PROFILE_TIER_LEVEL_H_ #include #include "absl/types/optional.h" #include "api/video_codecs/sdp_video_format.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { // Profiles can be found at: // https://www.itu.int/rec/T-REC-H.265 // The enum values match the number specified in the SDP. enum class H265Profile { kProfileMain = 1, kProfileMain10 = 2, kProfileMainStill = 3, kProfileRangeExtensions = 4, kProfileHighThroughput = 5, kProfileMultiviewMain = 6, kProfileScalableMain = 7, kProfile3dMain = 8, kProfileScreenContentCoding = 9, kProfileScalableRangeExtensions = 10, kProfileHighThroughputScreenContentCoding = 11, }; // Tiers can be found at https://www.itu.int/rec/T-REC-H.265 enum class H265Tier { kTier0, kTier1, }; // All values are equal to 30 times the level number. enum class H265Level { kLevel1 = 30, kLevel2 = 60, kLevel2_1 = 63, kLevel3 = 90, kLevel3_1 = 93, kLevel4 = 120, kLevel4_1 = 123, kLevel5 = 150, kLevel5_1 = 153, kLevel5_2 = 156, kLevel6 = 180, kLevel6_1 = 183, kLevel6_2 = 186, }; struct H265ProfileTierLevel { constexpr H265ProfileTierLevel(H265Profile profile, H265Tier tier, H265Level level) : profile(profile), tier(tier), level(level) {} H265Profile profile; H265Tier tier; H265Level level; }; // Helper function to convert H265Profile to std::string. RTC_EXPORT std::string H265ProfileToString(H265Profile profile); // Helper function to convert H265Tier to std::string. RTC_EXPORT std::string H265TierToString(H265Tier tier); // Helper function to convert H265Level to std::string. RTC_EXPORT std::string H265LevelToString(H265Level level); // Helper function to get H265Profile from profile string. RTC_EXPORT absl::optional StringToH265Profile( const std::string& profile); // Helper function to get H265Tier from tier string. RTC_EXPORT absl::optional StringToH265Tier(const std::string& tier); // Helper function to get H265Level from level string. RTC_EXPORT absl::optional StringToH265Level( const std::string& level); // Parses an SDP key-value map of format parameters to retrive an H265 // profile/tier/level. Returns an H265ProfileTierlevel by setting its // members. profile defaults to `kProfileMain` if no profile-id is specified. // tier defaults to "kTier0" if no tier-flag is specified. // level defaults to "kLevel3_1" if no level-id is specified. // Returns empty value if any of the profile/tier/level key is present but // contains an invalid value. RTC_EXPORT absl::optional ParseSdpForH265ProfileTierLevel( const CodecParameterMap& params); // Returns true if the parameters have the same H265 profile or neither contains // an H265 profile, otherwise false. RTC_EXPORT bool H265IsSameProfileTierLevel(const CodecParameterMap& params1, const CodecParameterMap& params2); } // namespace webrtc #endif // API_VIDEO_CODECS_H265_PROFILE_TIER_LEVEL_H_