xref: /aosp_15_r20/external/webrtc/sdk/objc/api/peerconnection/RTCMediaConstraints.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker/*
2*d9f75844SAndroid Build Coastguard Worker *  Copyright 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker#import "RTCMediaConstraints+Private.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h"
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker#include <memory>
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsAudioNetworkAdaptorConfig =
18*d9f75844SAndroid Build Coastguard Worker    @(webrtc::MediaConstraints::kAudioNetworkAdaptorConfig);
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsIceRestart = @(webrtc::MediaConstraints::kIceRestart);
21*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsOfferToReceiveAudio =
22*d9f75844SAndroid Build Coastguard Worker    @(webrtc::MediaConstraints::kOfferToReceiveAudio);
23*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsOfferToReceiveVideo =
24*d9f75844SAndroid Build Coastguard Worker    @(webrtc::MediaConstraints::kOfferToReceiveVideo);
25*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsVoiceActivityDetection =
26*d9f75844SAndroid Build Coastguard Worker    @(webrtc::MediaConstraints::kVoiceActivityDetection);
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsValueTrue = @(webrtc::MediaConstraints::kValueTrue);
29*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCMediaConstraintsValueFalse = @(webrtc::MediaConstraints::kValueFalse);
30*d9f75844SAndroid Build Coastguard Worker
31*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCMediaConstraints) {
32*d9f75844SAndroid Build Coastguard Worker  NSDictionary<NSString *, NSString *> *_mandatory;
33*d9f75844SAndroid Build Coastguard Worker  NSDictionary<NSString *, NSString *> *_optional;
34*d9f75844SAndroid Build Coastguard Worker}
35*d9f75844SAndroid Build Coastguard Worker
36*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithMandatoryConstraints:
37*d9f75844SAndroid Build Coastguard Worker    (NSDictionary<NSString *, NSString *> *)mandatory
38*d9f75844SAndroid Build Coastguard Worker                         optionalConstraints:
39*d9f75844SAndroid Build Coastguard Worker    (NSDictionary<NSString *, NSString *> *)optional {
40*d9f75844SAndroid Build Coastguard Worker  if (self = [super init]) {
41*d9f75844SAndroid Build Coastguard Worker    _mandatory = [[NSDictionary alloc] initWithDictionary:mandatory
42*d9f75844SAndroid Build Coastguard Worker                                                copyItems:YES];
43*d9f75844SAndroid Build Coastguard Worker    _optional = [[NSDictionary alloc] initWithDictionary:optional
44*d9f75844SAndroid Build Coastguard Worker                                               copyItems:YES];
45*d9f75844SAndroid Build Coastguard Worker  }
46*d9f75844SAndroid Build Coastguard Worker  return self;
47*d9f75844SAndroid Build Coastguard Worker}
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard Worker- (NSString *)description {
50*d9f75844SAndroid Build Coastguard Worker  return [NSString
51*d9f75844SAndroid Build Coastguard Worker      stringWithFormat:@"RTC_OBJC_TYPE(RTCMediaConstraints):\n%@\n%@", _mandatory, _optional];
52*d9f75844SAndroid Build Coastguard Worker}
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private
55*d9f75844SAndroid Build Coastguard Worker
56*d9f75844SAndroid Build Coastguard Worker- (std::unique_ptr<webrtc::MediaConstraints>)nativeConstraints {
57*d9f75844SAndroid Build Coastguard Worker  webrtc::MediaConstraints::Constraints mandatory =
58*d9f75844SAndroid Build Coastguard Worker      [[self class] nativeConstraintsForConstraints:_mandatory];
59*d9f75844SAndroid Build Coastguard Worker  webrtc::MediaConstraints::Constraints optional =
60*d9f75844SAndroid Build Coastguard Worker      [[self class] nativeConstraintsForConstraints:_optional];
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker  webrtc::MediaConstraints *nativeConstraints =
63*d9f75844SAndroid Build Coastguard Worker      new webrtc::MediaConstraints(mandatory, optional);
64*d9f75844SAndroid Build Coastguard Worker  return std::unique_ptr<webrtc::MediaConstraints>(nativeConstraints);
65*d9f75844SAndroid Build Coastguard Worker}
66*d9f75844SAndroid Build Coastguard Worker
67*d9f75844SAndroid Build Coastguard Worker+ (webrtc::MediaConstraints::Constraints)nativeConstraintsForConstraints:
68*d9f75844SAndroid Build Coastguard Worker    (NSDictionary<NSString *, NSString *> *)constraints {
69*d9f75844SAndroid Build Coastguard Worker  webrtc::MediaConstraints::Constraints nativeConstraints;
70*d9f75844SAndroid Build Coastguard Worker  for (NSString *key in constraints) {
71*d9f75844SAndroid Build Coastguard Worker    NSAssert([key isKindOfClass:[NSString class]],
72*d9f75844SAndroid Build Coastguard Worker             @"%@ is not an NSString.", key);
73*d9f75844SAndroid Build Coastguard Worker    NSString *value = [constraints objectForKey:key];
74*d9f75844SAndroid Build Coastguard Worker    NSAssert([value isKindOfClass:[NSString class]],
75*d9f75844SAndroid Build Coastguard Worker             @"%@ is not an NSString.", value);
76*d9f75844SAndroid Build Coastguard Worker    if ([kRTCMediaConstraintsAudioNetworkAdaptorConfig isEqualToString:key]) {
77*d9f75844SAndroid Build Coastguard Worker      // This value is base64 encoded.
78*d9f75844SAndroid Build Coastguard Worker      NSData *charData = [[NSData alloc] initWithBase64EncodedString:value options:0];
79*d9f75844SAndroid Build Coastguard Worker      std::string configValue =
80*d9f75844SAndroid Build Coastguard Worker          std::string(reinterpret_cast<const char *>(charData.bytes), charData.length);
81*d9f75844SAndroid Build Coastguard Worker      nativeConstraints.push_back(webrtc::MediaConstraints::Constraint(key.stdString, configValue));
82*d9f75844SAndroid Build Coastguard Worker    } else {
83*d9f75844SAndroid Build Coastguard Worker      nativeConstraints.push_back(
84*d9f75844SAndroid Build Coastguard Worker          webrtc::MediaConstraints::Constraint(key.stdString, value.stdString));
85*d9f75844SAndroid Build Coastguard Worker    }
86*d9f75844SAndroid Build Coastguard Worker  }
87*d9f75844SAndroid Build Coastguard Worker  return nativeConstraints;
88*d9f75844SAndroid Build Coastguard Worker}
89*d9f75844SAndroid Build Coastguard Worker
90*d9f75844SAndroid Build Coastguard Worker@end
91