/* * Copyright 2015 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. */ #import "RTCMediaConstraints+Private.h" #import "NSString+StdString.h" #include NSString * const kRTCMediaConstraintsMinAspectRatio = @(webrtc::MediaConstraintsInterface::kMinAspectRatio); NSString * const kRTCMediaConstraintsMaxAspectRatio = @(webrtc::MediaConstraintsInterface::kMaxAspectRatio); NSString * const kRTCMediaConstraintsMinWidth = @(webrtc::MediaConstraintsInterface::kMinWidth); NSString * const kRTCMediaConstraintsMaxWidth = @(webrtc::MediaConstraintsInterface::kMaxWidth); NSString * const kRTCMediaConstraintsMinHeight = @(webrtc::MediaConstraintsInterface::kMinHeight); NSString * const kRTCMediaConstraintsMaxHeight = @(webrtc::MediaConstraintsInterface::kMaxHeight); NSString * const kRTCMediaConstraintsMinFrameRate = @(webrtc::MediaConstraintsInterface::kMinFrameRate); NSString * const kRTCMediaConstraintsMaxFrameRate = @(webrtc::MediaConstraintsInterface::kMaxFrameRate); NSString * const kRTCMediaConstraintsAudioNetworkAdaptorConfig = @(webrtc::MediaConstraintsInterface::kAudioNetworkAdaptorConfig); NSString * const kRTCMediaConstraintsIceRestart = @(webrtc::MediaConstraintsInterface::kIceRestart); NSString * const kRTCMediaConstraintsOfferToReceiveAudio = @(webrtc::MediaConstraintsInterface::kOfferToReceiveAudio); NSString * const kRTCMediaConstraintsOfferToReceiveVideo = @(webrtc::MediaConstraintsInterface::kOfferToReceiveVideo); NSString * const kRTCMediaConstraintsVoiceActivityDetection = @(webrtc::MediaConstraintsInterface::kVoiceActivityDetection); NSString * const kRTCMediaConstraintsValueTrue = @(webrtc::MediaConstraintsInterface::kValueTrue); NSString * const kRTCMediaConstraintsValueFalse = @(webrtc::MediaConstraintsInterface::kValueFalse); namespace webrtc { MediaConstraints::~MediaConstraints() {} MediaConstraints::MediaConstraints() {} MediaConstraints::MediaConstraints( const MediaConstraintsInterface::Constraints& mandatory, const MediaConstraintsInterface::Constraints& optional) : mandatory_(mandatory), optional_(optional) {} const MediaConstraintsInterface::Constraints& MediaConstraints::GetMandatory() const { return mandatory_; } const MediaConstraintsInterface::Constraints& MediaConstraints::GetOptional() const { return optional_; } } // namespace webrtc @implementation RTCMediaConstraints { NSDictionary *_mandatory; NSDictionary *_optional; } - (instancetype)initWithMandatoryConstraints: (NSDictionary *)mandatory optionalConstraints: (NSDictionary *)optional { if (self = [super init]) { _mandatory = [[NSDictionary alloc] initWithDictionary:mandatory copyItems:YES]; _optional = [[NSDictionary alloc] initWithDictionary:optional copyItems:YES]; } return self; } - (NSString *)description { return [NSString stringWithFormat:@"RTCMediaConstraints:\n%@\n%@", _mandatory, _optional]; } #pragma mark - Private - (std::unique_ptr)nativeConstraints { webrtc::MediaConstraintsInterface::Constraints mandatory = [[self class] nativeConstraintsForConstraints:_mandatory]; webrtc::MediaConstraintsInterface::Constraints optional = [[self class] nativeConstraintsForConstraints:_optional]; webrtc::MediaConstraints *nativeConstraints = new webrtc::MediaConstraints(mandatory, optional); return std::unique_ptr(nativeConstraints); } + (webrtc::MediaConstraintsInterface::Constraints) nativeConstraintsForConstraints: (NSDictionary *)constraints { webrtc::MediaConstraintsInterface::Constraints nativeConstraints; for (NSString *key in constraints) { NSAssert([key isKindOfClass:[NSString class]], @"%@ is not an NSString.", key); NSString *value = [constraints objectForKey:key]; NSAssert([value isKindOfClass:[NSString class]], @"%@ is not an NSString.", value); if ([kRTCMediaConstraintsAudioNetworkAdaptorConfig isEqualToString:key]) { // This value is base64 encoded. NSData *charData = [[NSData alloc] initWithBase64EncodedString:value options:0]; std::string configValue = std::string(reinterpret_cast(charData.bytes), charData.length); nativeConstraints.push_back(webrtc::MediaConstraintsInterface::Constraint( key.stdString, configValue)); } else { nativeConstraints.push_back(webrtc::MediaConstraintsInterface::Constraint( key.stdString, value.stdString)); } } return nativeConstraints; } @end