1/* 2 * Copyright 2018 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#import "UIDevice+H264Profile.h" 12#import "helpers/UIDevice+RTCDevice.h" 13 14#include <algorithm> 15 16namespace { 17 18using namespace webrtc; 19 20struct SupportedH264Profile { 21 const RTCDeviceType deviceType; 22 const H264ProfileLevelId profile; 23}; 24 25constexpr SupportedH264Profile kH264MaxSupportedProfiles[] = { 26 // iPhones with at least iOS 9 27 {RTCDeviceTypeIPhone13ProMax, 28 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP848 29 {RTCDeviceTypeIPhone13Pro, 30 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP852 31 {RTCDeviceTypeIPhone13, 32 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP851 33 {RTCDeviceTypeIPhone13Mini, 34 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP847 35 {RTCDeviceTypeIPhoneSE2Gen, 36 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP820 37 {RTCDeviceTypeIPhone12ProMax, 38 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP832 39 {RTCDeviceTypeIPhone12Pro, 40 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP831 41 {RTCDeviceTypeIPhone12, 42 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP830 43 {RTCDeviceTypeIPhone12Mini, 44 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP829 45 {RTCDeviceTypeIPhone11ProMax, 46 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP806 47 {RTCDeviceTypeIPhone11Pro, 48 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP805 49 {RTCDeviceTypeIPhone11, 50 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP804 51 {RTCDeviceTypeIPhoneXS, 52 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP779 53 {RTCDeviceTypeIPhoneXSMax, 54 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP780 55 {RTCDeviceTypeIPhoneXR, 56 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP781 57 {RTCDeviceTypeIPhoneX, 58 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP770 59 {RTCDeviceTypeIPhone8, 60 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP767 61 {RTCDeviceTypeIPhone8Plus, 62 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP768 63 {RTCDeviceTypeIPhone7, 64 {H264Profile::kProfileHigh, H264Level::kLevel5_1}}, // https://support.apple.com/kb/SP743 65 {RTCDeviceTypeIPhone7Plus, 66 {H264Profile::kProfileHigh, H264Level::kLevel5_1}}, // https://support.apple.com/kb/SP744 67 {RTCDeviceTypeIPhoneSE, 68 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP738 69 {RTCDeviceTypeIPhone6S, 70 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP726 71 {RTCDeviceTypeIPhone6SPlus, 72 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP727 73 {RTCDeviceTypeIPhone6, 74 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP705 75 {RTCDeviceTypeIPhone6Plus, 76 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP706 77 {RTCDeviceTypeIPhone5SGSM, 78 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP685 79 {RTCDeviceTypeIPhone5SGSM_CDMA, 80 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP685 81 {RTCDeviceTypeIPhone5GSM, 82 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP655 83 {RTCDeviceTypeIPhone5GSM_CDMA, 84 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP655 85 {RTCDeviceTypeIPhone5CGSM, 86 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP684 87 {RTCDeviceTypeIPhone5CGSM_CDMA, 88 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP684 89 {RTCDeviceTypeIPhone4S, 90 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP643 91 92 // iPods with at least iOS 9 93 {RTCDeviceTypeIPodTouch7G, 94 {H264Profile::kProfileMain, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP796 95 {RTCDeviceTypeIPodTouch6G, 96 {H264Profile::kProfileMain, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP720 97 {RTCDeviceTypeIPodTouch5G, 98 {H264Profile::kProfileMain, H264Level::kLevel3_1}}, // https://support.apple.com/kb/SP657 99 100 // iPads with at least iOS 9 101 {RTCDeviceTypeIPadAir4Gen, 102 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP828 103 {RTCDeviceTypeIPad8, 104 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP822 105 {RTCDeviceTypeIPadPro4Gen12Inch, 106 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP815 107 {RTCDeviceTypeIPadPro4Gen11Inch, 108 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP814 109 {RTCDeviceTypeIPadAir3Gen, 110 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP787 111 {RTCDeviceTypeIPadMini5Gen, 112 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP788 113 {RTCDeviceTypeIPadPro3Gen12Inch, 114 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP785 115 {RTCDeviceTypeIPadPro3Gen11Inch, 116 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP784 117 {RTCDeviceTypeIPad7Gen10Inch, 118 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP807 119 {RTCDeviceTypeIPad2Wifi, 120 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622 121 {RTCDeviceTypeIPad2GSM, 122 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622 123 {RTCDeviceTypeIPad2CDMA, 124 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622 125 {RTCDeviceTypeIPad2Wifi2, 126 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622 127 {RTCDeviceTypeIPadMiniWifi, 128 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP661 129 {RTCDeviceTypeIPadMiniGSM, 130 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP661 131 {RTCDeviceTypeIPadMiniGSM_CDMA, 132 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP661 133 {RTCDeviceTypeIPad3Wifi, 134 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP647 135 {RTCDeviceTypeIPad3GSM_CDMA, 136 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP647 137 {RTCDeviceTypeIPad3GSM, 138 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP647 139 {RTCDeviceTypeIPad4Wifi, 140 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP662 141 {RTCDeviceTypeIPad4GSM, 142 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP662 143 {RTCDeviceTypeIPad4GSM_CDMA, 144 {H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP662 145 {RTCDeviceTypeIPad5, 146 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP751 147 {RTCDeviceTypeIPad6, 148 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP774 149 {RTCDeviceTypeIPadAirWifi, 150 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP692 151 {RTCDeviceTypeIPadAirCellular, 152 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP692 153 {RTCDeviceTypeIPadAirWifiCellular, 154 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP692 155 {RTCDeviceTypeIPadAir2, 156 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP708 157 {RTCDeviceTypeIPadMini2GWifi, 158 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP693 159 {RTCDeviceTypeIPadMini2GCellular, 160 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP693 161 {RTCDeviceTypeIPadMini2GWifiCellular, 162 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP693 163 {RTCDeviceTypeIPadMini3, 164 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP709 165 {RTCDeviceTypeIPadMini4, 166 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP725 167 {RTCDeviceTypeIPadPro9Inch, 168 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP739 169 {RTCDeviceTypeIPadPro12Inch, 170 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/sp723 171 {RTCDeviceTypeIPadPro12Inch2, 172 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP761 173 {RTCDeviceTypeIPadPro10Inch, 174 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP762 175 {RTCDeviceTypeIPadMini6, 176 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP850 177 {RTCDeviceTypeIPad9, 178 {H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP849 179 {RTCDeviceTypeIPadPro5Gen12Inch, 180 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP844 181 {RTCDeviceTypeIPadPro5Gen11Inch, 182 {H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP843 183}; 184 185absl::optional<H264ProfileLevelId> FindMaxSupportedProfileForDevice(RTCDeviceType deviceType) { 186 const auto* result = std::find_if(std::begin(kH264MaxSupportedProfiles), 187 std::end(kH264MaxSupportedProfiles), 188 [deviceType](const SupportedH264Profile& supportedProfile) { 189 return supportedProfile.deviceType == deviceType; 190 }); 191 if (result != std::end(kH264MaxSupportedProfiles)) { 192 return result->profile; 193 } 194 return absl::nullopt; 195} 196 197} // namespace 198 199@implementation UIDevice (H264Profile) 200 201+ (absl::optional<webrtc::H264ProfileLevelId>)maxSupportedH264Profile { 202 return FindMaxSupportedProfileForDevice([self deviceType]); 203} 204 205@end 206