Move h264_profile_level_id and vp9_profile to api/video_codecs
This is a refactor to simplify a follow-up CL of adding SdpVideoFormat::IsSameCodec. The original files media/base/h264_profile_level_id.* and media/base/vp9_profile.h must be kept until downstream projects stop using them. Bug: chroimium:1187565 Change-Id: Ib39eca095a3d61939a914d9bffaf4b891ddd222f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/215236 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Johannes Kron <kron@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33782}
This commit is contained in:
committed by
Commit Bot
parent
8546666cb9
commit
c3fcee7c3a
@ -16,7 +16,7 @@
|
||||
#import "UIDevice+H264Profile.h"
|
||||
#endif
|
||||
|
||||
#include "media/base/h264_profile_level_id.h"
|
||||
#include "api/video_codecs/h264_profile_level_id.h"
|
||||
#include "media/base/media_constants.h"
|
||||
|
||||
namespace {
|
||||
@ -38,13 +38,12 @@ namespace {
|
||||
|
||||
#if defined(WEBRTC_IOS)
|
||||
|
||||
using namespace webrtc::H264;
|
||||
|
||||
NSString *MaxSupportedLevelForProfile(Profile profile) {
|
||||
const absl::optional<ProfileLevelId> profileLevelId = [UIDevice maxSupportedH264Profile];
|
||||
NSString *MaxSupportedLevelForProfile(webrtc::H264Profile profile) {
|
||||
const absl::optional<webrtc::H264ProfileLevelId> profileLevelId =
|
||||
[UIDevice maxSupportedH264Profile];
|
||||
if (profileLevelId && profileLevelId->profile >= profile) {
|
||||
const absl::optional<std::string> profileString =
|
||||
ProfileLevelIdToString(ProfileLevelId(profile, profileLevelId->level));
|
||||
H264ProfileLevelIdToString(webrtc::H264ProfileLevelId(profile, profileLevelId->level));
|
||||
if (profileString) {
|
||||
return [NSString stringForStdString:*profileString];
|
||||
}
|
||||
@ -55,7 +54,7 @@ NSString *MaxSupportedLevelForProfile(Profile profile) {
|
||||
|
||||
NSString *MaxSupportedProfileLevelConstrainedBaseline() {
|
||||
#if defined(WEBRTC_IOS)
|
||||
NSString *profile = MaxSupportedLevelForProfile(webrtc::H264::kProfileConstrainedBaseline);
|
||||
NSString *profile = MaxSupportedLevelForProfile(webrtc::H264Profile::kProfileConstrainedBaseline);
|
||||
if (profile != nil) {
|
||||
return profile;
|
||||
}
|
||||
@ -65,7 +64,7 @@ NSString *MaxSupportedProfileLevelConstrainedBaseline() {
|
||||
|
||||
NSString *MaxSupportedProfileLevelConstrainedHigh() {
|
||||
#if defined(WEBRTC_IOS)
|
||||
NSString *profile = MaxSupportedLevelForProfile(webrtc::H264::kProfileConstrainedHigh);
|
||||
NSString *profile = MaxSupportedLevelForProfile(webrtc::H264Profile::kProfileConstrainedHigh);
|
||||
if (profile != nil) {
|
||||
return profile;
|
||||
}
|
||||
@ -94,8 +93,8 @@ NSString *MaxSupportedProfileLevelConstrainedHigh() {
|
||||
if (self = [super init]) {
|
||||
self.hexString = hexString;
|
||||
|
||||
absl::optional<webrtc::H264::ProfileLevelId> profile_level_id =
|
||||
webrtc::H264::ParseProfileLevelId([hexString cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
absl::optional<webrtc::H264ProfileLevelId> profile_level_id =
|
||||
webrtc::ParseH264ProfileLevelId([hexString cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
if (profile_level_id.has_value()) {
|
||||
self.profile = static_cast<RTCH264Profile>(profile_level_id->profile);
|
||||
self.level = static_cast<RTCH264Level>(profile_level_id->level);
|
||||
@ -110,8 +109,8 @@ NSString *MaxSupportedProfileLevelConstrainedHigh() {
|
||||
self.level = level;
|
||||
|
||||
absl::optional<std::string> hex_string =
|
||||
webrtc::H264::ProfileLevelIdToString(webrtc::H264::ProfileLevelId(
|
||||
static_cast<webrtc::H264::Profile>(profile), static_cast<webrtc::H264::Level>(level)));
|
||||
webrtc::H264ProfileLevelIdToString(webrtc::H264ProfileLevelId(
|
||||
static_cast<webrtc::H264Profile>(profile), static_cast<webrtc::H264Level>(level)));
|
||||
self.hexString =
|
||||
[NSString stringWithCString:hex_string.value_or("").c_str() encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
@ -28,8 +28,8 @@
|
||||
#import "components/video_frame_buffer/RTCCVPixelBuffer.h"
|
||||
#import "helpers.h"
|
||||
|
||||
#include "api/video_codecs/h264_profile_level_id.h"
|
||||
#include "common_video/h264/h264_bitstream_parser.h"
|
||||
#include "common_video/h264/profile_level_id.h"
|
||||
#include "common_video/include/bitrate_adjuster.h"
|
||||
#include "modules/video_coding/include/video_error_codes.h"
|
||||
#include "rtc_base/buffer.h"
|
||||
@ -173,100 +173,100 @@ void compressionOutputCallback(void *encoder,
|
||||
// no specific VideoToolbox profile for the specified level, AutoLevel will be
|
||||
// returned. The user must initialize the encoder with a resolution and
|
||||
// framerate conforming to the selected H264 level regardless.
|
||||
CFStringRef ExtractProfile(const webrtc::H264::ProfileLevelId &profile_level_id) {
|
||||
CFStringRef ExtractProfile(const webrtc::H264ProfileLevelId &profile_level_id) {
|
||||
switch (profile_level_id.profile) {
|
||||
case webrtc::H264::kProfileConstrainedBaseline:
|
||||
case webrtc::H264::kProfileBaseline:
|
||||
case webrtc::H264Profile::kProfileConstrainedBaseline:
|
||||
case webrtc::H264Profile::kProfileBaseline:
|
||||
switch (profile_level_id.level) {
|
||||
case webrtc::H264::kLevel3:
|
||||
case webrtc::H264Level::kLevel3:
|
||||
return kVTProfileLevel_H264_Baseline_3_0;
|
||||
case webrtc::H264::kLevel3_1:
|
||||
case webrtc::H264Level::kLevel3_1:
|
||||
return kVTProfileLevel_H264_Baseline_3_1;
|
||||
case webrtc::H264::kLevel3_2:
|
||||
case webrtc::H264Level::kLevel3_2:
|
||||
return kVTProfileLevel_H264_Baseline_3_2;
|
||||
case webrtc::H264::kLevel4:
|
||||
case webrtc::H264Level::kLevel4:
|
||||
return kVTProfileLevel_H264_Baseline_4_0;
|
||||
case webrtc::H264::kLevel4_1:
|
||||
case webrtc::H264Level::kLevel4_1:
|
||||
return kVTProfileLevel_H264_Baseline_4_1;
|
||||
case webrtc::H264::kLevel4_2:
|
||||
case webrtc::H264Level::kLevel4_2:
|
||||
return kVTProfileLevel_H264_Baseline_4_2;
|
||||
case webrtc::H264::kLevel5:
|
||||
case webrtc::H264Level::kLevel5:
|
||||
return kVTProfileLevel_H264_Baseline_5_0;
|
||||
case webrtc::H264::kLevel5_1:
|
||||
case webrtc::H264Level::kLevel5_1:
|
||||
return kVTProfileLevel_H264_Baseline_5_1;
|
||||
case webrtc::H264::kLevel5_2:
|
||||
case webrtc::H264Level::kLevel5_2:
|
||||
return kVTProfileLevel_H264_Baseline_5_2;
|
||||
case webrtc::H264::kLevel1:
|
||||
case webrtc::H264::kLevel1_b:
|
||||
case webrtc::H264::kLevel1_1:
|
||||
case webrtc::H264::kLevel1_2:
|
||||
case webrtc::H264::kLevel1_3:
|
||||
case webrtc::H264::kLevel2:
|
||||
case webrtc::H264::kLevel2_1:
|
||||
case webrtc::H264::kLevel2_2:
|
||||
case webrtc::H264Level::kLevel1:
|
||||
case webrtc::H264Level::kLevel1_b:
|
||||
case webrtc::H264Level::kLevel1_1:
|
||||
case webrtc::H264Level::kLevel1_2:
|
||||
case webrtc::H264Level::kLevel1_3:
|
||||
case webrtc::H264Level::kLevel2:
|
||||
case webrtc::H264Level::kLevel2_1:
|
||||
case webrtc::H264Level::kLevel2_2:
|
||||
return kVTProfileLevel_H264_Baseline_AutoLevel;
|
||||
}
|
||||
|
||||
case webrtc::H264::kProfileMain:
|
||||
case webrtc::H264Profile::kProfileMain:
|
||||
switch (profile_level_id.level) {
|
||||
case webrtc::H264::kLevel3:
|
||||
case webrtc::H264Level::kLevel3:
|
||||
return kVTProfileLevel_H264_Main_3_0;
|
||||
case webrtc::H264::kLevel3_1:
|
||||
case webrtc::H264Level::kLevel3_1:
|
||||
return kVTProfileLevel_H264_Main_3_1;
|
||||
case webrtc::H264::kLevel3_2:
|
||||
case webrtc::H264Level::kLevel3_2:
|
||||
return kVTProfileLevel_H264_Main_3_2;
|
||||
case webrtc::H264::kLevel4:
|
||||
case webrtc::H264Level::kLevel4:
|
||||
return kVTProfileLevel_H264_Main_4_0;
|
||||
case webrtc::H264::kLevel4_1:
|
||||
case webrtc::H264Level::kLevel4_1:
|
||||
return kVTProfileLevel_H264_Main_4_1;
|
||||
case webrtc::H264::kLevel4_2:
|
||||
case webrtc::H264Level::kLevel4_2:
|
||||
return kVTProfileLevel_H264_Main_4_2;
|
||||
case webrtc::H264::kLevel5:
|
||||
case webrtc::H264Level::kLevel5:
|
||||
return kVTProfileLevel_H264_Main_5_0;
|
||||
case webrtc::H264::kLevel5_1:
|
||||
case webrtc::H264Level::kLevel5_1:
|
||||
return kVTProfileLevel_H264_Main_5_1;
|
||||
case webrtc::H264::kLevel5_2:
|
||||
case webrtc::H264Level::kLevel5_2:
|
||||
return kVTProfileLevel_H264_Main_5_2;
|
||||
case webrtc::H264::kLevel1:
|
||||
case webrtc::H264::kLevel1_b:
|
||||
case webrtc::H264::kLevel1_1:
|
||||
case webrtc::H264::kLevel1_2:
|
||||
case webrtc::H264::kLevel1_3:
|
||||
case webrtc::H264::kLevel2:
|
||||
case webrtc::H264::kLevel2_1:
|
||||
case webrtc::H264::kLevel2_2:
|
||||
case webrtc::H264Level::kLevel1:
|
||||
case webrtc::H264Level::kLevel1_b:
|
||||
case webrtc::H264Level::kLevel1_1:
|
||||
case webrtc::H264Level::kLevel1_2:
|
||||
case webrtc::H264Level::kLevel1_3:
|
||||
case webrtc::H264Level::kLevel2:
|
||||
case webrtc::H264Level::kLevel2_1:
|
||||
case webrtc::H264Level::kLevel2_2:
|
||||
return kVTProfileLevel_H264_Main_AutoLevel;
|
||||
}
|
||||
|
||||
case webrtc::H264::kProfileConstrainedHigh:
|
||||
case webrtc::H264::kProfileHigh:
|
||||
case webrtc::H264Profile::kProfileConstrainedHigh:
|
||||
case webrtc::H264Profile::kProfileHigh:
|
||||
switch (profile_level_id.level) {
|
||||
case webrtc::H264::kLevel3:
|
||||
case webrtc::H264Level::kLevel3:
|
||||
return kVTProfileLevel_H264_High_3_0;
|
||||
case webrtc::H264::kLevel3_1:
|
||||
case webrtc::H264Level::kLevel3_1:
|
||||
return kVTProfileLevel_H264_High_3_1;
|
||||
case webrtc::H264::kLevel3_2:
|
||||
case webrtc::H264Level::kLevel3_2:
|
||||
return kVTProfileLevel_H264_High_3_2;
|
||||
case webrtc::H264::kLevel4:
|
||||
case webrtc::H264Level::kLevel4:
|
||||
return kVTProfileLevel_H264_High_4_0;
|
||||
case webrtc::H264::kLevel4_1:
|
||||
case webrtc::H264Level::kLevel4_1:
|
||||
return kVTProfileLevel_H264_High_4_1;
|
||||
case webrtc::H264::kLevel4_2:
|
||||
case webrtc::H264Level::kLevel4_2:
|
||||
return kVTProfileLevel_H264_High_4_2;
|
||||
case webrtc::H264::kLevel5:
|
||||
case webrtc::H264Level::kLevel5:
|
||||
return kVTProfileLevel_H264_High_5_0;
|
||||
case webrtc::H264::kLevel5_1:
|
||||
case webrtc::H264Level::kLevel5_1:
|
||||
return kVTProfileLevel_H264_High_5_1;
|
||||
case webrtc::H264::kLevel5_2:
|
||||
case webrtc::H264Level::kLevel5_2:
|
||||
return kVTProfileLevel_H264_High_5_2;
|
||||
case webrtc::H264::kLevel1:
|
||||
case webrtc::H264::kLevel1_b:
|
||||
case webrtc::H264::kLevel1_1:
|
||||
case webrtc::H264::kLevel1_2:
|
||||
case webrtc::H264::kLevel1_3:
|
||||
case webrtc::H264::kLevel2:
|
||||
case webrtc::H264::kLevel2_1:
|
||||
case webrtc::H264::kLevel2_2:
|
||||
case webrtc::H264Level::kLevel1:
|
||||
case webrtc::H264Level::kLevel1_b:
|
||||
case webrtc::H264Level::kLevel1_1:
|
||||
case webrtc::H264Level::kLevel1_2:
|
||||
case webrtc::H264Level::kLevel1_3:
|
||||
case webrtc::H264Level::kLevel2:
|
||||
case webrtc::H264Level::kLevel2_1:
|
||||
case webrtc::H264Level::kLevel2_2:
|
||||
return kVTProfileLevel_H264_High_AutoLevel;
|
||||
}
|
||||
}
|
||||
@ -276,33 +276,33 @@ CFStringRef ExtractProfile(const webrtc::H264::ProfileLevelId &profile_level_id)
|
||||
// can be processed by given encoder with |profile_level_id|.
|
||||
// See https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.264-201610-S!!PDF-E&type=items
|
||||
// for details.
|
||||
NSUInteger GetMaxSampleRate(const webrtc::H264::ProfileLevelId &profile_level_id) {
|
||||
NSUInteger GetMaxSampleRate(const webrtc::H264ProfileLevelId &profile_level_id) {
|
||||
switch (profile_level_id.level) {
|
||||
case webrtc::H264::kLevel3:
|
||||
case webrtc::H264Level::kLevel3:
|
||||
return 10368000;
|
||||
case webrtc::H264::kLevel3_1:
|
||||
case webrtc::H264Level::kLevel3_1:
|
||||
return 27648000;
|
||||
case webrtc::H264::kLevel3_2:
|
||||
case webrtc::H264Level::kLevel3_2:
|
||||
return 55296000;
|
||||
case webrtc::H264::kLevel4:
|
||||
case webrtc::H264::kLevel4_1:
|
||||
case webrtc::H264Level::kLevel4:
|
||||
case webrtc::H264Level::kLevel4_1:
|
||||
return 62914560;
|
||||
case webrtc::H264::kLevel4_2:
|
||||
case webrtc::H264Level::kLevel4_2:
|
||||
return 133693440;
|
||||
case webrtc::H264::kLevel5:
|
||||
case webrtc::H264Level::kLevel5:
|
||||
return 150994944;
|
||||
case webrtc::H264::kLevel5_1:
|
||||
case webrtc::H264Level::kLevel5_1:
|
||||
return 251658240;
|
||||
case webrtc::H264::kLevel5_2:
|
||||
case webrtc::H264Level::kLevel5_2:
|
||||
return 530841600;
|
||||
case webrtc::H264::kLevel1:
|
||||
case webrtc::H264::kLevel1_b:
|
||||
case webrtc::H264::kLevel1_1:
|
||||
case webrtc::H264::kLevel1_2:
|
||||
case webrtc::H264::kLevel1_3:
|
||||
case webrtc::H264::kLevel2:
|
||||
case webrtc::H264::kLevel2_1:
|
||||
case webrtc::H264::kLevel2_2:
|
||||
case webrtc::H264Level::kLevel1:
|
||||
case webrtc::H264Level::kLevel1_b:
|
||||
case webrtc::H264Level::kLevel1_1:
|
||||
case webrtc::H264Level::kLevel1_2:
|
||||
case webrtc::H264Level::kLevel1_3:
|
||||
case webrtc::H264Level::kLevel2:
|
||||
case webrtc::H264Level::kLevel2_1:
|
||||
case webrtc::H264Level::kLevel2_2:
|
||||
// Zero means auto rate setting.
|
||||
return 0;
|
||||
}
|
||||
@ -317,7 +317,7 @@ NSUInteger GetMaxSampleRate(const webrtc::H264::ProfileLevelId &profile_level_id
|
||||
uint32_t _encoderFrameRate;
|
||||
uint32_t _maxAllowedFrameRate;
|
||||
RTCH264PacketizationMode _packetizationMode;
|
||||
absl::optional<webrtc::H264::ProfileLevelId> _profile_level_id;
|
||||
absl::optional<webrtc::H264ProfileLevelId> _profile_level_id;
|
||||
RTCVideoEncoderCallback _callback;
|
||||
int32_t _width;
|
||||
int32_t _height;
|
||||
@ -342,7 +342,7 @@ NSUInteger GetMaxSampleRate(const webrtc::H264::ProfileLevelId &profile_level_id
|
||||
_bitrateAdjuster.reset(new webrtc::BitrateAdjuster(.5, .95));
|
||||
_packetizationMode = RTCH264PacketizationModeNonInterleaved;
|
||||
_profile_level_id =
|
||||
webrtc::H264::ParseSdpProfileLevelId([codecInfo nativeSdpVideoFormat].parameters);
|
||||
webrtc::ParseSdpForH264ProfileLevelId([codecInfo nativeSdpVideoFormat].parameters);
|
||||
RTC_DCHECK(_profile_level_id);
|
||||
RTC_LOG(LS_INFO) << "Using profile " << CFStringToString(ExtractProfile(*_profile_level_id));
|
||||
RTC_CHECK([codecInfo.name isEqualToString:kRTCVideoCodecH264Name]);
|
||||
|
||||
@ -10,10 +10,10 @@
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#include "media/base/h264_profile_level_id.h"
|
||||
#include "api/video_codecs/h264_profile_level_id.h"
|
||||
|
||||
@interface UIDevice (H264Profile)
|
||||
|
||||
+ (absl::optional<webrtc::H264::ProfileLevelId>)maxSupportedH264Profile;
|
||||
+ (absl::optional<webrtc::H264ProfileLevelId>)maxSupportedH264Profile;
|
||||
|
||||
@end
|
||||
|
||||
@ -15,99 +15,156 @@
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace webrtc::H264;
|
||||
using namespace webrtc;
|
||||
|
||||
struct SupportedH264Profile {
|
||||
const RTCDeviceType deviceType;
|
||||
const ProfileLevelId profile;
|
||||
const H264ProfileLevelId profile;
|
||||
};
|
||||
|
||||
constexpr SupportedH264Profile kH264MaxSupportedProfiles[] = {
|
||||
// iPhones with at least iOS 9
|
||||
{RTCDeviceTypeIPhone12ProMax, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP832
|
||||
{RTCDeviceTypeIPhone12Pro, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP831
|
||||
{RTCDeviceTypeIPhone12, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP830
|
||||
{RTCDeviceTypeIPhone12Mini, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP829
|
||||
{RTCDeviceTypeIPhone11ProMax, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP806
|
||||
{RTCDeviceTypeIPhone11Pro, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP805
|
||||
{RTCDeviceTypeIPhone11, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP804
|
||||
{RTCDeviceTypeIPhoneXS, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP779
|
||||
{RTCDeviceTypeIPhoneXSMax, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP780
|
||||
{RTCDeviceTypeIPhoneXR, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP781
|
||||
{RTCDeviceTypeIPhoneX, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP770
|
||||
{RTCDeviceTypeIPhone8, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP767
|
||||
{RTCDeviceTypeIPhone8Plus, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP768
|
||||
{RTCDeviceTypeIPhone7, {kProfileHigh, kLevel5_1}}, // https://support.apple.com/kb/SP743
|
||||
{RTCDeviceTypeIPhone7Plus, {kProfileHigh, kLevel5_1}}, // https://support.apple.com/kb/SP744
|
||||
{RTCDeviceTypeIPhoneSE, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP738
|
||||
{RTCDeviceTypeIPhone6S, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP726
|
||||
{RTCDeviceTypeIPhone6SPlus, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP727
|
||||
{RTCDeviceTypeIPhone6, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP705
|
||||
{RTCDeviceTypeIPhone6Plus, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP706
|
||||
{RTCDeviceTypeIPhone5SGSM, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP685
|
||||
{RTCDeviceTypeIPhone12ProMax,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP832
|
||||
{RTCDeviceTypeIPhone12Pro,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP831
|
||||
{RTCDeviceTypeIPhone12,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP830
|
||||
{RTCDeviceTypeIPhone12Mini,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP829
|
||||
{RTCDeviceTypeIPhone11ProMax,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP806
|
||||
{RTCDeviceTypeIPhone11Pro,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP805
|
||||
{RTCDeviceTypeIPhone11,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP804
|
||||
{RTCDeviceTypeIPhoneXS,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP779
|
||||
{RTCDeviceTypeIPhoneXSMax,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP780
|
||||
{RTCDeviceTypeIPhoneXR,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP781
|
||||
{RTCDeviceTypeIPhoneX,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP770
|
||||
{RTCDeviceTypeIPhone8,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP767
|
||||
{RTCDeviceTypeIPhone8Plus,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP768
|
||||
{RTCDeviceTypeIPhone7,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_1}}, // https://support.apple.com/kb/SP743
|
||||
{RTCDeviceTypeIPhone7Plus,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_1}}, // https://support.apple.com/kb/SP744
|
||||
{RTCDeviceTypeIPhoneSE,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP738
|
||||
{RTCDeviceTypeIPhone6S,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP726
|
||||
{RTCDeviceTypeIPhone6SPlus,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP727
|
||||
{RTCDeviceTypeIPhone6,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP705
|
||||
{RTCDeviceTypeIPhone6Plus,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP706
|
||||
{RTCDeviceTypeIPhone5SGSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP685
|
||||
{RTCDeviceTypeIPhone5SGSM_CDMA,
|
||||
{kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP685
|
||||
{RTCDeviceTypeIPhone5GSM, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP655
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP685
|
||||
{RTCDeviceTypeIPhone5GSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP655
|
||||
{RTCDeviceTypeIPhone5GSM_CDMA,
|
||||
{kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP655
|
||||
{RTCDeviceTypeIPhone5CGSM, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP684
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP655
|
||||
{RTCDeviceTypeIPhone5CGSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP684
|
||||
{RTCDeviceTypeIPhone5CGSM_CDMA,
|
||||
{kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP684
|
||||
{RTCDeviceTypeIPhone4S, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP643
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP684
|
||||
{RTCDeviceTypeIPhone4S,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP643
|
||||
|
||||
// iPods with at least iOS 9
|
||||
{RTCDeviceTypeIPodTouch7G, {kProfileMain, kLevel4_1}}, // https://support.apple.com/kb/SP796
|
||||
{RTCDeviceTypeIPodTouch6G, {kProfileMain, kLevel4_1}}, // https://support.apple.com/kb/SP720
|
||||
{RTCDeviceTypeIPodTouch5G, {kProfileMain, kLevel3_1}}, // https://support.apple.com/kb/SP657
|
||||
{RTCDeviceTypeIPodTouch7G,
|
||||
{H264Profile::kProfileMain, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP796
|
||||
{RTCDeviceTypeIPodTouch6G,
|
||||
{H264Profile::kProfileMain, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP720
|
||||
{RTCDeviceTypeIPodTouch5G,
|
||||
{H264Profile::kProfileMain, H264Level::kLevel3_1}}, // https://support.apple.com/kb/SP657
|
||||
|
||||
// iPads with at least iOS 9
|
||||
{RTCDeviceTypeIPadAir4Gen, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP828
|
||||
{RTCDeviceTypeIPad8, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP822
|
||||
{RTCDeviceTypeIPadPro4Gen12Inch, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP815
|
||||
{RTCDeviceTypeIPadPro4Gen11Inch, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP814
|
||||
{RTCDeviceTypeIPadAir3Gen, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP787
|
||||
{RTCDeviceTypeIPadMini5Gen, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP788
|
||||
{RTCDeviceTypeIPadAir4Gen,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP828
|
||||
{RTCDeviceTypeIPad8,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP822
|
||||
{RTCDeviceTypeIPadPro4Gen12Inch,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP815
|
||||
{RTCDeviceTypeIPadPro4Gen11Inch,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP814
|
||||
{RTCDeviceTypeIPadAir3Gen,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP787
|
||||
{RTCDeviceTypeIPadMini5Gen,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP788
|
||||
{RTCDeviceTypeIPadPro3Gen12Inch,
|
||||
{kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP785
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP785
|
||||
{RTCDeviceTypeIPadPro3Gen11Inch,
|
||||
{kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP784
|
||||
{RTCDeviceTypeIPad7Gen10Inch, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP807
|
||||
{RTCDeviceTypeIPad2Wifi, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPad2GSM, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPad2CDMA, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPad2Wifi2, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPadMiniWifi, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP661
|
||||
{RTCDeviceTypeIPadMiniGSM, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP661
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel5_2}}, // https://support.apple.com/kb/SP784
|
||||
{RTCDeviceTypeIPad7Gen10Inch,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP807
|
||||
{RTCDeviceTypeIPad2Wifi,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPad2GSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPad2CDMA,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPad2Wifi2,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP622
|
||||
{RTCDeviceTypeIPadMiniWifi,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP661
|
||||
{RTCDeviceTypeIPadMiniGSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP661
|
||||
{RTCDeviceTypeIPadMiniGSM_CDMA,
|
||||
{kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP661
|
||||
{RTCDeviceTypeIPad3Wifi, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP647
|
||||
{RTCDeviceTypeIPad3GSM_CDMA, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP647
|
||||
{RTCDeviceTypeIPad3GSM, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP647
|
||||
{RTCDeviceTypeIPad4Wifi, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP662
|
||||
{RTCDeviceTypeIPad4GSM, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP662
|
||||
{RTCDeviceTypeIPad4GSM_CDMA, {kProfileHigh, kLevel4_1}}, // https://support.apple.com/kb/SP662
|
||||
{RTCDeviceTypeIPad5, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP751
|
||||
{RTCDeviceTypeIPad6, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP774
|
||||
{RTCDeviceTypeIPadAirWifi, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP692
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP661
|
||||
{RTCDeviceTypeIPad3Wifi,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP647
|
||||
{RTCDeviceTypeIPad3GSM_CDMA,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP647
|
||||
{RTCDeviceTypeIPad3GSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP647
|
||||
{RTCDeviceTypeIPad4Wifi,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP662
|
||||
{RTCDeviceTypeIPad4GSM,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP662
|
||||
{RTCDeviceTypeIPad4GSM_CDMA,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_1}}, // https://support.apple.com/kb/SP662
|
||||
{RTCDeviceTypeIPad5,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP751
|
||||
{RTCDeviceTypeIPad6,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP774
|
||||
{RTCDeviceTypeIPadAirWifi,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP692
|
||||
{RTCDeviceTypeIPadAirCellular,
|
||||
{kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP692
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP692
|
||||
{RTCDeviceTypeIPadAirWifiCellular,
|
||||
{kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP692
|
||||
{RTCDeviceTypeIPadAir2, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP708
|
||||
{RTCDeviceTypeIPadMini2GWifi, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP693
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP692
|
||||
{RTCDeviceTypeIPadAir2,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP708
|
||||
{RTCDeviceTypeIPadMini2GWifi,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP693
|
||||
{RTCDeviceTypeIPadMini2GCellular,
|
||||
{kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP693
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP693
|
||||
{RTCDeviceTypeIPadMini2GWifiCellular,
|
||||
{kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP693
|
||||
{RTCDeviceTypeIPadMini3, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP709
|
||||
{RTCDeviceTypeIPadMini4, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP725
|
||||
{RTCDeviceTypeIPadPro9Inch, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP739
|
||||
{RTCDeviceTypeIPadPro12Inch, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/sp723
|
||||
{RTCDeviceTypeIPadPro12Inch2, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP761
|
||||
{RTCDeviceTypeIPadPro10Inch, {kProfileHigh, kLevel4_2}}, // https://support.apple.com/kb/SP762
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP693
|
||||
{RTCDeviceTypeIPadMini3,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP709
|
||||
{RTCDeviceTypeIPadMini4,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP725
|
||||
{RTCDeviceTypeIPadPro9Inch,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP739
|
||||
{RTCDeviceTypeIPadPro12Inch,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/sp723
|
||||
{RTCDeviceTypeIPadPro12Inch2,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP761
|
||||
{RTCDeviceTypeIPadPro10Inch,
|
||||
{H264Profile::kProfileHigh, H264Level::kLevel4_2}}, // https://support.apple.com/kb/SP762
|
||||
};
|
||||
|
||||
absl::optional<ProfileLevelId> FindMaxSupportedProfileForDevice(RTCDeviceType deviceType) {
|
||||
absl::optional<H264ProfileLevelId> FindMaxSupportedProfileForDevice(RTCDeviceType deviceType) {
|
||||
const auto* result = std::find_if(std::begin(kH264MaxSupportedProfiles),
|
||||
std::end(kH264MaxSupportedProfiles),
|
||||
[deviceType](const SupportedH264Profile& supportedProfile) {
|
||||
@ -123,7 +180,7 @@ absl::optional<ProfileLevelId> FindMaxSupportedProfileForDevice(RTCDeviceType de
|
||||
|
||||
@implementation UIDevice (H264Profile)
|
||||
|
||||
+ (absl::optional<webrtc::H264::ProfileLevelId>)maxSupportedH264Profile {
|
||||
+ (absl::optional<webrtc::H264ProfileLevelId>)maxSupportedH264Profile {
|
||||
return FindMaxSupportedProfileForDevice([self deviceType]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user