xref: /aosp_15_r20/external/webrtc/sdk/objc/components/video_codec/UIDevice+H264Profile.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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