diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 683d8e5829..f2e4040fc1 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -902,6 +902,8 @@ if (is_ios || is_mac) { ":base_objc", ":helpers_objc", "../api/video:encoded_image", + "../api/video_codecs:scalability_mode", + "../api/video_codecs:scalability_mode_helper", "../api/video_codecs:video_codecs_api", "../modules/video_coding:video_codec_interface", "../rtc_base:refcount", diff --git a/sdk/objc/api/peerconnection/RTCVideoCodecInfo+Private.mm b/sdk/objc/api/peerconnection/RTCVideoCodecInfo+Private.mm index 2eb8d366d2..ea01a5fd29 100644 --- a/sdk/objc/api/peerconnection/RTCVideoCodecInfo+Private.mm +++ b/sdk/objc/api/peerconnection/RTCVideoCodecInfo+Private.mm @@ -10,18 +10,28 @@ #import "RTCVideoCodecInfo+Private.h" +#include "api/video_codecs/scalability_mode.h" +#include "api/video_codecs/scalability_mode_helper.h" #import "helpers/NSString+StdString.h" @implementation RTC_OBJC_TYPE (RTCVideoCodecInfo) (Private) - (instancetype)initWithNativeSdpVideoFormat : (webrtc::SdpVideoFormat)format { - NSMutableDictionary *params = [NSMutableDictionary dictionary]; - for (auto it = format.parameters.begin(); it != format.parameters.end(); ++it) { - [params setObject:[NSString stringForStdString:it->second] - forKey:[NSString stringForStdString:it->first]]; + NSMutableDictionary* params = [NSMutableDictionary dictionary]; + for (const auto& [key, value] : format.parameters) { + [params setObject:[NSString stringForStdString:value] forKey:[NSString stringForStdString:key]]; } - return [self initWithName:[NSString stringForStdString:format.name] parameters:params]; + + NSMutableArray* scalabilityModes = + [NSMutableArray arrayWithCapacity:format.scalability_modes.size()]; + for (webrtc::ScalabilityMode mode : format.scalability_modes) { + [scalabilityModes addObject:[NSString stringForAbslStringView:ScalabilityModeToString(mode)]]; + } + + return [self initWithName:[NSString stringForStdString:format.name] + parameters:params + scalabilityModes:scalabilityModes]; } - (webrtc::SdpVideoFormat)nativeSdpVideoFormat { @@ -32,7 +42,17 @@ parameters[key] = value; } - return webrtc::SdpVideoFormat([NSString stdStringForString:self.name], parameters); + absl::InlinedVector scalability_modes; + for (NSString* mode_name in self.scalabilityModes) { + absl::optional mode = + webrtc::ScalabilityModeStringToEnum([NSString stdStringForString:mode_name]); + if (mode.has_value()) { + scalability_modes.push_back(*mode); + } + } + + return webrtc::SdpVideoFormat( + [NSString stdStringForString:self.name], parameters, scalability_modes); } @end diff --git a/sdk/objc/base/RTCVideoCodecInfo.h b/sdk/objc/base/RTCVideoCodecInfo.h index fa28958f25..684918c24e 100644 --- a/sdk/objc/base/RTCVideoCodecInfo.h +++ b/sdk/objc/base/RTCVideoCodecInfo.h @@ -23,13 +23,17 @@ RTC_OBJC_EXPORT - (instancetype)initWithName:(NSString *)name; - (instancetype)initWithName:(NSString *)name - parameters:(nullable NSDictionary *)parameters - NS_DESIGNATED_INITIALIZER; + parameters:(nullable NSDictionary *)parameters; + +- (instancetype)initWithName:(NSString *)name + parameters:(NSDictionary *)parameters + scalabilityModes:(NSArray *)scalabilityModes NS_DESIGNATED_INITIALIZER; - (BOOL)isEqualToCodecInfo:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)info; @property(nonatomic, readonly) NSString *name; @property(nonatomic, readonly) NSDictionary *parameters; +@property(nonatomic, readonly) NSArray *scalabilityModes; @end diff --git a/sdk/objc/base/RTCVideoCodecInfo.m b/sdk/objc/base/RTCVideoCodecInfo.m index 8effa298d2..a45c2d33fb 100644 --- a/sdk/objc/base/RTCVideoCodecInfo.m +++ b/sdk/objc/base/RTCVideoCodecInfo.m @@ -14,26 +14,35 @@ @synthesize name = _name; @synthesize parameters = _parameters; +@synthesize scalabilityModes = _scalabilityModes; - (instancetype)initWithName:(NSString *)name { - return [self initWithName:name parameters:nil]; + return [self initWithName:name parameters:@{} scalabilityModes:@[]]; } - (instancetype)initWithName:(NSString *)name parameters:(nullable NSDictionary *)parameters { + NSDictionary *params = parameters ? parameters : @{}; + return [self initWithName:name parameters:params scalabilityModes:@[]]; +} + +- (instancetype)initWithName:(NSString *)name + parameters:(NSDictionary *)parameters + scalabilityModes:(NSArray *)scalabilityModes { self = [super init]; if (self) { _name = name; - _parameters = (parameters ? parameters : @{}); + _parameters = parameters; + _scalabilityModes = scalabilityModes; } return self; } - (BOOL)isEqualToCodecInfo:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)info { - if (!info || - ![self.name isEqualToString:info.name] || - ![self.parameters isEqualToDictionary:info.parameters]) { + if (!info || ![self.name isEqualToString:info.name] || + ![self.parameters isEqualToDictionary:info.parameters] || + ![self.scalabilityModes isEqualToArray:info.scalabilityModes]) { return NO; } return YES;