/* | |
* 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 <string> | |
#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<H265Profile> StringToH265Profile( | |
const std::string& profile); | |
// Helper function to get H265Tier from tier string. | |
RTC_EXPORT absl::optional<H265Tier> StringToH265Tier(const std::string& tier); | |
// Helper function to get H265Level from level string. | |
RTC_EXPORT absl::optional<H265Level> 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<H265ProfileTierLevel> ParseSdpForH265ProfileTierLevel( | |
const SdpVideoFormat::Parameters& params); | |
// Returns true if the parameters have the same H265 profile or neither contains | |
// an H265 profile, otherwise false. | |
bool H265IsSameProfileTierLevel(const SdpVideoFormat::Parameters& params1, | |
const SdpVideoFormat::Parameters& params2); | |
} // namespace webrtc | |
#endif // API_VIDEO_CODECS_H265_PROFILE_TIER_LEVEL_H_ |