diff --git a/raw-video/Podfile b/raw-video/Podfile index 1a17ae1..5821445 100644 --- a/raw-video/Podfile +++ b/raw-video/Podfile @@ -6,5 +6,6 @@ target 'RawVideo' do project 'RawVideo.xcodeproj' workspace 'RawVideo.xcworkspace' - pod 'AzureCommunicationCalling', '2.8.0' + #pod 'AzureCommunicationCalling', '2.8.0' + pod 'AzureCommunicationCommon' end diff --git a/raw-video/Podfile.lock b/raw-video/Podfile.lock index 5963003..eed9f40 100644 --- a/raw-video/Podfile.lock +++ b/raw-video/Podfile.lock @@ -1,20 +1,16 @@ PODS: - - AzureCommunicationCalling (2.8.0): - - AzureCommunicationCommon (~> 1.0) - - AzureCommunicationCommon (1.1.1) + - AzureCommunicationCommon (1.2.0) DEPENDENCIES: - - AzureCommunicationCalling (= 2.8.0) + - AzureCommunicationCommon SPEC REPOS: trunk: - - AzureCommunicationCalling - AzureCommunicationCommon SPEC CHECKSUMS: - AzureCommunicationCalling: 4c15cc33497ad858aee28561fdd4937cef3049f6 - AzureCommunicationCommon: cc520a89f3f8db6d58de42ec4a70cfb79a1b76a3 + AzureCommunicationCommon: 130a21be2be889f83dc4adbf994af6285f962de8 -PODFILE CHECKSUM: d48399eee113905b1a99e90963e2eaf60a804ad8 +PODFILE CHECKSUM: dc0cb3c07e00dc4a492afcce596f4b7d04f8ea34 COCOAPODS: 1.15.2 diff --git a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/AutoRefreshTokenCredential.swift b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/AutoRefreshTokenCredential.swift index bf66046..1261fba 100644 --- a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/AutoRefreshTokenCredential.swift +++ b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/AutoRefreshTokenCredential.swift @@ -67,4 +67,11 @@ internal class AutoRefreshTokenCredential: CommunicationTokenCredentialProviding completionHandler(newAccessToken, error) } } + + /** + Cancels any internal auto-refresh operation. + */ + public func cancel() { + accessTokenCache.cancel() + } } diff --git a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredential.swift b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredential.swift index 015a0e1..8edfbcd 100644 --- a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredential.swift +++ b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredential.swift @@ -25,16 +25,15 @@ // -------------------------------------------------------------------------- import Foundation - public typealias CommunicationTokenCompletionHandler = (CommunicationAccessToken?, Error?) -> Void public typealias TokenRefreshHandler = (String?, Error?) -> Void /** The Azure Communication Services User token credential. This class is used to cache/refresh the access token required by Azure Communication Services. */ -@objcMembers public class CommunicationTokenCredential: NSObject { +@objcMembers public class CommunicationTokenCredential: NSObject, Cancellable { private let userTokenCredential: CommunicationTokenCredentialProviding - + private var isCancelled = false /** Creates a static `CommunicationTokenCredential` object from the provided token. @@ -66,6 +65,25 @@ public typealias TokenRefreshHandler = (String?, Error?) -> Void `AccessToken` returns a token and an expiry date if applicable. `Error` returns `nil` if the current token can be returned. */ public func token(completionHandler: @escaping CommunicationTokenCompletionHandler) { + guard !isCancelled else { + let exception = NSError( + domain: "AzureCommunicationCommon.CommunicationTokenCredential.token", + code: 0, + userInfo: [ + "message": "An instance of CommunicationTokenCredential cannot be reused once it has been canceled." + ] + ) + completionHandler(nil, exception) + return + } userTokenCredential.token(completionHandler: completionHandler) } + + /** + Disposes the CommunicationTokenCredential and cancels any internal auto-refresh operation. + */ + public func cancel() { + isCancelled = true + userTokenCredential.cancel() + } } diff --git a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredentialProviding.swift b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredentialProviding.swift index f3767fb..2b5ef79 100644 --- a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredentialProviding.swift +++ b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredentialProviding.swift @@ -25,10 +25,19 @@ // -------------------------------------------------------------------------- import Foundation + +/** + A protocol indicating that an operation supports cancellation. + */ +public protocol Cancellable { + /// Cancel the operation and also stops side effects such as timers, schedulers, network access. + func cancel() +} + /** Protocol defining the shape of credentials used with Azure Communication Services. */ -public protocol CommunicationTokenCredentialProviding { +public protocol CommunicationTokenCredentialProviding: Cancellable { /** Retrieve an access token from the credential. - Parameter completionHandler: Closure that accepts an optional `AccessToken` or optional `Error` as parameters. `AccessToken` returns a token and an expiry date if applicable. diff --git a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/StaticTokenCredential.swift b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/StaticTokenCredential.swift index 3d3c624..ef1a1fd 100644 --- a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/StaticTokenCredential.swift +++ b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/StaticTokenCredential.swift @@ -53,4 +53,9 @@ internal class StaticTokenCredential: CommunicationTokenCredentialProviding { public func token(completionHandler: CommunicationTokenCompletionHandler) { completionHandler(accessToken, nil) } + + /** + Intentionally empty as it does not have any internal auto-refresh operation. + */ + public func cancel() {} } diff --git a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/ThreadSafeRefreshableAccessTokenCache.swift b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/ThreadSafeRefreshableAccessTokenCache.swift index 561c050..ddb4ad0 100644 --- a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/ThreadSafeRefreshableAccessTokenCache.swift +++ b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Authentication/ThreadSafeRefreshableAccessTokenCache.swift @@ -26,7 +26,7 @@ import Foundation -internal class ThreadSafeRefreshableAccessTokenCache { +internal class ThreadSafeRefreshableAccessTokenCache: Cancellable { private var currentToken: CommunicationAccessToken { didSet { maybeScheduleRefresh() @@ -38,6 +38,7 @@ internal class ThreadSafeRefreshableAccessTokenCache { private let proactiveRefreshingInterval = TimeInterval(600) private let onDemandRefreshingInterval = TimeInterval(120) + private let refreshAfterTTLDivider = 2.0 private let tokenRefresher: TokenRefreshAction let anyThreadRefreshing = DispatchSemaphore(value: 1) @@ -75,6 +76,13 @@ internal class ThreadSafeRefreshableAccessTokenCache { do { let newAccessToken = try JwtTokenParser.createAccessToken(newToken!) + guard !self.isTokenExpired(accessToken: newAccessToken) else { + throw NSError( + domain: "AzureCommunicationCommon.ThreadSafeRefreshableAccessTokenCache.refreshAccessToken", + code: 0, + userInfo: ["message": "The token returned from the tokenRefresher is expired."] + ) + } completionHandler(newAccessToken, nil) } catch { completionHandler(nil, error) @@ -131,18 +139,28 @@ internal class ThreadSafeRefreshableAccessTokenCache { if !scheduleProactivelyRefreshing { return } - - let actionPeriod = shouldRefresh() - ? TimeInterval.zero - : (currentToken.expiresOn - proactiveRefreshingInterval).timeIntervalSinceNow - + var actionPeriod = TimeInterval.zero + if !isTokenExpired(accessToken: currentToken) { + let now = Date() + let tokenTtl = currentToken.expiresOn.timeIntervalSince(now) + actionPeriod = shouldRefresh() + ? tokenTtl / refreshAfterTTLDivider + : tokenTtl - proactiveRefreshingInterval + } proactiveRefreshTimer?.invalidate() - proactiveRefreshTimer = Timer.scheduledTimer(withTimeInterval: actionPeriod, repeats: false) { [weak self] _ in self?.getValue { _, _ in } } } + private func isTokenExpired(accessToken: CommunicationAccessToken?) -> Bool { + return accessToken == nil || Date() >= accessToken!.expiresOn + } + + public func cancel() { + proactiveRefreshTimer?.invalidate() + } + deinit { proactiveRefreshTimer?.invalidate() } diff --git a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Identifiers.swift b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Identifiers.swift index 92beed9..2cd11ce 100644 --- a/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Identifiers.swift +++ b/raw-video/Pods/AzureCommunicationCommon/sdk/communication/AzureCommunicationCommon/Source/Identifiers.swift @@ -25,15 +25,17 @@ // -------------------------------------------------------------------------- import Foundation +import os.log + /** The IdentifierKind for a given CommunicationIdentifier. */ - @objcMembers public class IdentifierKind: NSObject { private var rawValue: String public static let communicationUser = IdentifierKind(rawValue: "communicationUser") public static let phoneNumber = IdentifierKind(rawValue: "phoneNumber") public static let microsoftTeamsUser = IdentifierKind(rawValue: "microsoftTeamsUser") + public static let microsoftTeamsApp = IdentifierKind(rawValue: "microsoftTeamsApp") public static let unknown = IdentifierKind(rawValue: "unknown") public init(rawValue: String) { @@ -50,54 +52,55 @@ import Foundation var kind: IdentifierKind { get } } +internal enum Prefix { + public static let PhoneNumber = "4:" + public static let TeamsAppPublicCloud = "28:orgid:" + public static let TeamsAppDodCloud = "28:dod:" + public static let TeamsAppGcchCloud = "28:gcch:" + public static let TeamsUserAnonymous = "8:teamsvisitor:" + public static let TeamsUserPublicCloud = "8:orgid:" + public static let TeamsUserDodCloud = "8:dod:" + public static let TeamsUserGcchCloud = "8:gcch:" + public static let AcsUser = "8:acs:" + public static let AcsUserDodCloud = "8:dod-acs:" + public static let AcsUserGcchCloud = "8:gcch-acs:" + public static let SpoolUser = "8:spool:" +} + /** Creates a CommunicationIdentifierKind from a given rawId. When storing rawIds use this function to restore the identifier that was encoded in the rawId. - Parameter fromRawId: Id of the Microsoft Teams user. If the user isn't anonymous,The rawId to be translated to its identifier representation. */ public func createCommunicationIdentifier(fromRawId rawId: String) -> CommunicationIdentifier { - let phoneNumberPrefix = "4:" - let teamUserAnonymousPrefix = "8:teamsvisitor:" - let teamUserPublicCloudPrefix = "8:orgid:" - let teamUserDODCloudPrefix = "8:dod:" - let teamUserGCCHCloudPrefix = "8:gcch:" - let acsUser = "8:acs:" - let spoolUser = "8:spool:" - let dodAcsUser = "8:dod-acs:" - let gcchAcsUser = "8:gcch-acs:" - if rawId.hasPrefix(phoneNumberPrefix) { - return PhoneNumberIdentifier(phoneNumber: String(rawId.dropFirst(phoneNumberPrefix.count)), rawId: rawId) + if rawId.hasPrefix(Prefix.PhoneNumber) { + return PhoneNumberIdentifier(phoneNumber: String(rawId.dropFirst(Prefix.PhoneNumber.count)), rawId: rawId) } let segments = rawId.split(separator: ":") - if segments.count < 3 { + let segmentCounts = segments.count + if segmentCounts != 3 { return UnknownIdentifier(rawId) } let scope = segments[0] + ":" + segments[1] + ":" - let suffix = String(rawId.dropFirst(scope.count)) + let suffix = String(segments[2]) switch scope { - case teamUserAnonymousPrefix: + case Prefix.TeamsUserAnonymous: return MicrosoftTeamsUserIdentifier(userId: suffix, isAnonymous: true) - case teamUserPublicCloudPrefix: - return MicrosoftTeamsUserIdentifier( - userId: suffix, - isAnonymous: false, - rawId: rawId, - cloudEnvironment: .Public - ) - case teamUserDODCloudPrefix: - return MicrosoftTeamsUserIdentifier( - userId: suffix, - isAnonymous: false, - rawId: rawId, - cloudEnvironment: .Dod - ) - case teamUserGCCHCloudPrefix: - return MicrosoftTeamsUserIdentifier( - userId: suffix, - isAnonymous: false, - rawId: rawId, - cloudEnvironment: .Gcch - ) - case acsUser, spoolUser, dodAcsUser, gcchAcsUser: + case Prefix.TeamsUserPublicCloud: + return MicrosoftTeamsUserIdentifier(userId: suffix, isAnonymous: false, rawId: rawId, cloudEnvironment: .Public) + case Prefix.TeamsUserDodCloud: + return MicrosoftTeamsUserIdentifier(userId: suffix, isAnonymous: false, rawId: rawId, cloudEnvironment: .Dod) + case Prefix.TeamsUserGcchCloud: + return MicrosoftTeamsUserIdentifier(userId: suffix, isAnonymous: false, rawId: rawId, cloudEnvironment: .Gcch) + case Prefix.TeamsAppPublicCloud: + return MicrosoftTeamsAppIdentifier(appId: suffix, cloudEnvironment: .Public) + case Prefix.TeamsAppDodCloud: + return MicrosoftTeamsAppIdentifier(appId: suffix, cloudEnvironment: .Dod) + case Prefix.TeamsAppGcchCloud: + return MicrosoftTeamsAppIdentifier(appId: suffix, cloudEnvironment: .Gcch) + case Prefix.AcsUser, + Prefix.SpoolUser, + Prefix.AcsUserDodCloud, + Prefix.AcsUserGcchCloud: return CommunicationUserIdentifier(rawId) default: return UnknownIdentifier(rawId) @@ -123,6 +126,7 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat /** Catch-all for all other Communication identifiers for Communication Services + It is not advisable to rely on this type of identifier, as UnknownIdentifier could become a new or existing distinct type in the future. */ @objcMembers public class UnknownIdentifier: NSObject, CommunicationIdentifier { public var rawId: String { return identifier } @@ -135,6 +139,22 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat @objc(initWithIdentifier:) public init(_ identifier: String) { self.identifier = identifier + super.init() + logUsageWarning() + } + + private func logUsageWarning() { + let subsystem = "com.azure" + let category = "AzureCommunicationCommon" + let message = "It is not advisable to rely on this type of identifier" + + "as UnknownIdentifier could become a new or existing distinct type in the future." + let osLog = OSLog(subsystem: subsystem, category: category) + if #available(macOS 11.0, iOS 14.0, watchOS 7.0, tvOS 14.0, *) { + let logger = Logger(osLog) + logger.info("\(message)") + } else { + os_log("%@", log: osLog, type: .info, message) + } } } @@ -160,13 +180,13 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat } } + // swiftlint:disable:next nsobject_prefer_isequal /** Returns a Boolean value indicating whether two values are equal. Note: In Objective-C favor isEqual() method - Parameter lhs PhoneNumberIdentifier to compare. - Parameter rhs Another PhoneNumberIdentifier to compare. */ - // swiftlint:disable nsobject_prefer_isequal public static func == (lhs: PhoneNumberIdentifier, rhs: PhoneNumberIdentifier) -> Bool { return lhs.rawId == rhs.rawId } @@ -193,7 +213,9 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat public let isAnonymous: Bool public private(set) var rawId: String public var kind: IdentifierKind { return .microsoftTeamsUser } + @available(*, deprecated, renamed: "cloudEnvironment") public let cloudEnviroment: CommunicationCloudEnvironment + public let cloudEnvironment: CommunicationCloudEnvironment /** Creates a MicrosoftTeamsUserIdentifier object @@ -213,23 +235,21 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat ) { self.userId = userId self.isAnonymous = isAnonymous + self.cloudEnvironment = cloudEnvironment self.cloudEnviroment = cloudEnvironment - if let rawId = rawId { self.rawId = rawId } else { if isAnonymous { - self.rawId = "8:teamsvisitor:" + userId + self.rawId = Prefix.TeamsUserAnonymous + userId } else { switch cloudEnvironment { case .Dod: - self.rawId = "8:dod:" + userId + self.rawId = Prefix.TeamsUserDodCloud + userId case .Gcch: - self.rawId = "8:gcch:" + userId - case .Public: - self.rawId = "8:orgid:" + userId + self.rawId = Prefix.TeamsUserGcchCloud + userId default: - self.rawId = "8:orgid:" + userId + self.rawId = Prefix.TeamsUserPublicCloud + userId } } } @@ -246,13 +266,13 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat self.init(userId: userId, isAnonymous: isAnonymous, rawId: nil, cloudEnvironment: .Public) } + // swiftlint:disable:next nsobject_prefer_isequal /** Returns a Boolean value indicating whether two values are equal. Note: In Objective-C favor isEqual() method - Parameter lhs MicrosoftTeamsUserIdentifier to compare. - Parameter rhs Another MicrosoftTeamsUserIdentifier to compare. */ - // swiftlint:disable nsobject_prefer_isequal public static func == (lhs: MicrosoftTeamsUserIdentifier, rhs: MicrosoftTeamsUserIdentifier) -> Bool { return lhs.rawId == rhs.rawId } @@ -270,3 +290,60 @@ public func createCommunicationIdentifier(fromRawId rawId: String) -> Communicat return rawId == object.rawId } } + +/** + Communication identifier for Microsoft Teams applications. + */ +@objcMembers public class MicrosoftTeamsAppIdentifier: NSObject, CommunicationIdentifier { + public let appId: String + public let cloudEnvironment: CommunicationCloudEnvironment + public var rawId: String + public var kind: IdentifierKind { return .microsoftTeamsApp } + + /** + Creates a MicrosoftTeamsAppIdentifier object + - Parameter appId: The id of the Microsoft Teams application. + - Parameter cloudEnvironment: The cloud that the Microsoft Teams application belongs to. + A null value translates to the Public cloud. + */ + public init( + appId: String, + cloudEnvironment: CommunicationCloudEnvironment = .Public + ) { + self.appId = appId + self.cloudEnvironment = cloudEnvironment + + switch cloudEnvironment { + case .Dod: + self.rawId = Prefix.TeamsAppDodCloud + appId + case .Gcch: + self.rawId = Prefix.TeamsAppGcchCloud + appId + default: + self.rawId = Prefix.TeamsAppPublicCloud + appId + } + } + + // swiftlint:disable:next nsobject_prefer_isequal + /** + Returns a Boolean value indicating whether two values are equal. + Note: In Objective-C favor isEqual() method + - Parameter lhs MicrosoftTeamsAppIdentifier to compare. + - Parameter rhs Another MicrosoftTeamsAppIdentifier to compare. + */ + public static func == (lhs: MicrosoftTeamsAppIdentifier, rhs: MicrosoftTeamsAppIdentifier) -> Bool { + return lhs.rawId == rhs.rawId + } + + /** + Returns a Boolean value that indicates whether the receiver is equal to another given object. + This will automatically return false if object being compared to is not a MicrosoftTeamsAppIdentifier. + - Parameter object The object with which to compare the receiver. + */ + override public func isEqual(_ object: Any?) -> Bool { + guard let object = object as? MicrosoftTeamsAppIdentifier else { + return false + } + + return rawId == object.rawId + } +} diff --git a/raw-video/Pods/Manifest.lock b/raw-video/Pods/Manifest.lock index 5963003..eed9f40 100644 --- a/raw-video/Pods/Manifest.lock +++ b/raw-video/Pods/Manifest.lock @@ -1,20 +1,16 @@ PODS: - - AzureCommunicationCalling (2.8.0): - - AzureCommunicationCommon (~> 1.0) - - AzureCommunicationCommon (1.1.1) + - AzureCommunicationCommon (1.2.0) DEPENDENCIES: - - AzureCommunicationCalling (= 2.8.0) + - AzureCommunicationCommon SPEC REPOS: trunk: - - AzureCommunicationCalling - AzureCommunicationCommon SPEC CHECKSUMS: - AzureCommunicationCalling: 4c15cc33497ad858aee28561fdd4937cef3049f6 - AzureCommunicationCommon: cc520a89f3f8db6d58de42ec4a70cfb79a1b76a3 + AzureCommunicationCommon: 130a21be2be889f83dc4adbf994af6285f962de8 -PODFILE CHECKSUM: d48399eee113905b1a99e90963e2eaf60a804ad8 +PODFILE CHECKSUM: dc0cb3c07e00dc4a492afcce596f4b7d04f8ea34 COCOAPODS: 1.15.2 diff --git a/raw-video/Pods/Pods.xcodeproj/project.pbxproj b/raw-video/Pods/Pods.xcodeproj/project.pbxproj index ec91741..ade061f 100644 --- a/raw-video/Pods/Pods.xcodeproj/project.pbxproj +++ b/raw-video/Pods/Pods.xcodeproj/project.pbxproj @@ -6,149 +6,114 @@ objectVersion = 55; objects = { -/* Begin PBXAggregateTarget section */ - 17D2EB69FA839BA1C46085F1047783CB /* AzureCommunicationCalling */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 9B8484DC33D295C398D28B22A2965560 /* Build configuration list for PBXAggregateTarget "AzureCommunicationCalling" */; - buildPhases = ( - 4B6724BB9F2E6B8B69BA870D6D2EF397 /* [CP] Copy XCFrameworks */, - ); - dependencies = ( - 9138D34950B4667210D1EB4BD1B242D3 /* PBXTargetDependency */, - ); - name = AzureCommunicationCalling; - }; -/* End PBXAggregateTarget section */ - /* Begin PBXBuildFile section */ - 129F19AD0D5D2DBF9AE106C8BD73492C /* Pods-RawVideo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 76224A6BA81576E7113AC2BBE1739B4D /* Pods-RawVideo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3398B951E6CF6A3001269C359557A3E5 /* JwtTokenParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20C58B353D2B3D0C957416AF3E684126 /* JwtTokenParser.swift */; }; - 433318E3C668C684F7505A594944F6D8 /* Identifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CD06013E0B895CC824C20B587B118B /* Identifiers.swift */; }; - 441D236ACB1828D06E3192524A0766A9 /* CommunicationTokenRefreshOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A43C2F17303BACDDE700DD7571CE12E /* CommunicationTokenRefreshOptions.swift */; }; - 45FBB6816D4E666E549ECA0DD3FC307C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 46EBA36BB26563CC5689198A33BDFED9 /* Pods-RawVideo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0796A916FED387DD6FC1020A59EBAB1F /* Pods-RawVideo-dummy.m */; }; - 5B698DC33678A01C35FF4F23EC157483 /* StaticTokenCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C9C5FF3D64BEE8C41021B7F2F4C7A19 /* StaticTokenCredential.swift */; }; - 9D8A18ED7F49D7F10731DE28F2FADBD0 /* CommunicationTokenCredentialProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5029A2EDAE360351BE72CE2EF8434FC /* CommunicationTokenCredentialProviding.swift */; }; - 9F388D282F4BE59048F82B41CBBEDF70 /* ThreadSafeRefreshableAccessTokenCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC699474FBD176B7042E955935EB3C15 /* ThreadSafeRefreshableAccessTokenCache.swift */; }; - B4697E753C880880D0E8EC6A506E9A80 /* AzureCommunicationCommon-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7628E9E3EE16548309429ECEE3BE28F7 /* AzureCommunicationCommon-dummy.m */; }; - DD62BDCF116841F8198DA7375F8A54DB /* CommunicationAccessToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 034FAF64E7062FFF1C1ADCC8B84E97C3 /* CommunicationAccessToken.swift */; }; - E0A5DAF7298FABD55B939E4076A7EAC9 /* AzureCommunicationCommon-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D552FED248760C136CE29E180C419DC2 /* AzureCommunicationCommon-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E10F03C7851EFE350F25C337FC73443D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - E8D2517ECD2E28E543DF3A861CD109F6 /* CommunicationTokenCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BA2E9DC9D7E166FE0DC02F9576D7D3 /* CommunicationTokenCredential.swift */; }; - FACD2FFC72B1A711C4F0C1F015427038 /* AutoRefreshTokenCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9CF3D51655548854CA4F2CBD57E43C /* AutoRefreshTokenCredential.swift */; }; - FEC1217A4EA7D77D6852E29BE12FBFCD /* CommunicationCloudEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28BFF553CF9ECD0BD5527F4913539AEF /* CommunicationCloudEnvironment.swift */; }; + 063BBFD310C4FAA91628665CB77DDBF3 /* ThreadSafeRefreshableAccessTokenCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50765CE7C437193EE2539E683EBD5BB1 /* ThreadSafeRefreshableAccessTokenCache.swift */; }; + 1BACECB315BEB1ABAAB1160859D9F2C7 /* AzureCommunicationCommon-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DA5E45B6984D8D09D199FE4FCE7C27D8 /* AzureCommunicationCommon-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2087E27F0CDECB11105AA8084FF123F4 /* CommunicationCloudEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491AE5EC7CF282893D2258232F714236 /* CommunicationCloudEnvironment.swift */; }; + 392B40CDBC0E0C7C4A5AC16BFDD65676 /* AzureCommunicationCommon-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B39697E302A224995D285D97607044DB /* AzureCommunicationCommon-dummy.m */; }; + 3DCD51389CE17BF0F8617A3B3FAE9DBC /* JwtTokenParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078F1026338814E3788D84DC9B88986D /* JwtTokenParser.swift */; }; + 51C5CF129B1B419841F90C2C86315D8C /* CommunicationTokenRefreshOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FBA3D820DDA68AFE20DDD5D75ACBF0 /* CommunicationTokenRefreshOptions.swift */; }; + 5F05C402101473F90DE8C3FFA5A77DBE /* StaticTokenCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195F790D44906AE81AA726422748CF69 /* StaticTokenCredential.swift */; }; + 71388BD1ED8AF1D8A73D73B8773CE5DC /* AutoRefreshTokenCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C44C8EDADFA6E433B7C81925D28E90C /* AutoRefreshTokenCredential.swift */; }; + 83B2CAD54477B8D72B3DF93510C21561 /* CommunicationTokenCredentialProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = A466E6620626FA1D6EA2B77E31CE9F70 /* CommunicationTokenCredentialProviding.swift */; }; + B8814C7C3AF09F92DE0D7075A600EB2A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + B923DF9DA446FF746B965CCCB7C02748 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + C6E07F6542C071CF4A78149F7E073229 /* Pods-RawVideo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 76224A6BA81576E7113AC2BBE1739B4D /* Pods-RawVideo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C97ED0154E26E5215B93D8DFE0E87DF1 /* CommunicationAccessToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8AC0BC2BBE4937BEE5613605AC5EBA /* CommunicationAccessToken.swift */; }; + DF15588A1BB9E593C7B03AA58951C2BD /* Pods-RawVideo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0796A916FED387DD6FC1020A59EBAB1F /* Pods-RawVideo-dummy.m */; }; + F2B845F3D16A3D0549BD079B3C7CC7CE /* Identifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7EAA9242BADE87A90071F3E4A49DA6A /* Identifiers.swift */; }; + F58CFBF5379CBD86B4893BBE99C30049 /* CommunicationTokenCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3C62B2629A1AF3A33571F2D337C3603 /* CommunicationTokenCredential.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2DE1A29AA2CCDAFB546D0D10E00C0279 /* PBXContainerItemProxy */ = { + 2784BDD4D27BC0496B2B443348DA6A31 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 07A6CC1D379046F22ADCE2752CDEF14A; remoteInfo = AzureCommunicationCommon; }; - 935D716FEBCE092A194C705C91B58406 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 07A6CC1D379046F22ADCE2752CDEF14A; - remoteInfo = AzureCommunicationCommon; - }; - E521074A60E34ECF52535D236CAE0A1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 17D2EB69FA839BA1C46085F1047783CB; - remoteInfo = AzureCommunicationCalling; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 034FAF64E7062FFF1C1ADCC8B84E97C3 /* CommunicationAccessToken.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationAccessToken.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationAccessToken.swift; sourceTree = ""; }; 046BE0A5D32340465034A0DF75B74940 /* AzureCommunicationCommon */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AzureCommunicationCommon; path = AzureCommunicationCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 04E3DBF836B80358B6219B3FA389E5D0 /* AzureCommunicationCalling.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AzureCommunicationCalling.h; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/AzureCommunicationCalling.h"; sourceTree = ""; }; + 078F1026338814E3788D84DC9B88986D /* JwtTokenParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JwtTokenParser.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/JwtTokenParser.swift; sourceTree = ""; }; 0796A916FED387DD6FC1020A59EBAB1F /* Pods-RawVideo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-RawVideo-dummy.m"; sourceTree = ""; }; - 0A43C2F17303BACDDE700DD7571CE12E /* CommunicationTokenRefreshOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationTokenRefreshOptions.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenRefreshOptions.swift; sourceTree = ""; }; - 0D7B006A22F92F4B0A80B01D8CDAB403 /* AzureCommunicationCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AzureCommunicationCommon.release.xcconfig; sourceTree = ""; }; - 0EEB8CCA207FD1F37667F022A8C091EA /* ACSVideoStreamRendererView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSVideoStreamRendererView.h; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/ACSVideoStreamRendererView.h"; sourceTree = ""; }; - 11AE4CF8B5263A2779FE97EEFEC9393C /* ACSVideoStreamRendererView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSVideoStreamRendererView.h; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/ACSVideoStreamRendererView.h"; sourceTree = ""; }; 1265F4CD946C2B8248E735C704A203D2 /* Pods-RawVideo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RawVideo-Info.plist"; sourceTree = ""; }; - 2013DB12F67E8B77AEB626E064E5F83D /* AzureCommunicationCalling-Swift.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "AzureCommunicationCalling-Swift.h"; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/AzureCommunicationCalling-Swift.h"; sourceTree = ""; }; - 20C58B353D2B3D0C957416AF3E684126 /* JwtTokenParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JwtTokenParser.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/JwtTokenParser.swift; sourceTree = ""; }; + 195F790D44906AE81AA726422748CF69 /* StaticTokenCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StaticTokenCredential.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/StaticTokenCredential.swift; sourceTree = ""; }; + 1B8AC0BC2BBE4937BEE5613605AC5EBA /* CommunicationAccessToken.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationAccessToken.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationAccessToken.swift; sourceTree = ""; }; 22DCB8FAE8C6CDC812FDAF8AE428ED2B /* Pods-RawVideo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RawVideo-acknowledgements.plist"; sourceTree = ""; }; - 26BF86715ACD7E501647C958C680738D /* AzureCommunicationCalling.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AzureCommunicationCalling.h; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/AzureCommunicationCalling.h"; sourceTree = ""; }; - 26CD06013E0B895CC824C20B587B118B /* Identifiers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Identifiers.swift; path = sdk/communication/AzureCommunicationCommon/Source/Identifiers.swift; sourceTree = ""; }; - 28BFF553CF9ECD0BD5527F4913539AEF /* CommunicationCloudEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationCloudEnvironment.swift; path = sdk/communication/AzureCommunicationCommon/Source/CommunicationCloudEnvironment.swift; sourceTree = ""; }; - 34BA2E9DC9D7E166FE0DC02F9576D7D3 /* CommunicationTokenCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationTokenCredential.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredential.swift; sourceTree = ""; }; 406E79335486643876B80FFA2C567C71 /* Pods-RawVideo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RawVideo.debug.xcconfig"; sourceTree = ""; }; - 5134C34AAFBF1CE90FEB5760A7BC0A50 /* AzureCommunicationCommon.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AzureCommunicationCommon.modulemap; sourceTree = ""; }; - 518B277543A2B4860528B26348224DDC /* AzureCommunicationCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AzureCommunicationCommon.debug.xcconfig; sourceTree = ""; }; - 56B635F69F262904C5EA2EAF7C9561F2 /* ACSStreamSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSStreamSize.h; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/ACSStreamSize.h"; sourceTree = ""; }; - 56F4637618179036371B462912A0A179 /* ACSFeatures.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSFeatures.h; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/ACSFeatures.h"; sourceTree = ""; }; - 6B33D5791E4EDDCC5281D68EABEC5DE5 /* ACSCallKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSCallKit.h; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/ACSCallKit.h"; sourceTree = ""; }; + 491AE5EC7CF282893D2258232F714236 /* CommunicationCloudEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationCloudEnvironment.swift; path = sdk/communication/AzureCommunicationCommon/Source/CommunicationCloudEnvironment.swift; sourceTree = ""; }; + 50765CE7C437193EE2539E683EBD5BB1 /* ThreadSafeRefreshableAccessTokenCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadSafeRefreshableAccessTokenCache.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/ThreadSafeRefreshableAccessTokenCache.swift; sourceTree = ""; }; + 54FBA3D820DDA68AFE20DDD5D75ACBF0 /* CommunicationTokenRefreshOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationTokenRefreshOptions.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenRefreshOptions.swift; sourceTree = ""; }; + 594F1F7B8BBE8FCA4CB6A817605DF034 /* AzureCommunicationCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AzureCommunicationCommon.release.xcconfig; sourceTree = ""; }; + 5FBE86FC7DB05E996217A33889FCDB15 /* AzureCommunicationCommon.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AzureCommunicationCommon.modulemap; sourceTree = ""; }; + 67688B7309728FE878BA6BB96887EE19 /* AzureCommunicationCommon-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AzureCommunicationCommon-Info.plist"; sourceTree = ""; }; 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 76224A6BA81576E7113AC2BBE1739B4D /* Pods-RawVideo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-RawVideo-umbrella.h"; sourceTree = ""; }; - 7628E9E3EE16548309429ECEE3BE28F7 /* AzureCommunicationCommon-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AzureCommunicationCommon-dummy.m"; sourceTree = ""; }; - 7C9C5FF3D64BEE8C41021B7F2F4C7A19 /* StaticTokenCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StaticTokenCredential.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/StaticTokenCredential.swift; sourceTree = ""; }; - 7D45EC918D28DBF763D7DE828F55940A /* AzureCommunicationCalling.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AzureCommunicationCalling.debug.xcconfig; sourceTree = ""; }; - 829D8681539D94CC4ADEA97347FC83C5 /* ACSVideoStreamRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSVideoStreamRenderer.h; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/ACSVideoStreamRenderer.h"; sourceTree = ""; }; + 77D70B2EA1BB4841C7E566E021D85486 /* AzureCommunicationCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AzureCommunicationCommon.debug.xcconfig; sourceTree = ""; }; 838A804A69EEC7B905F1344FEA0EC608 /* Pods-RawVideo */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-RawVideo"; path = Pods_RawVideo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 894EAD9C5EB681482B77DC5D97B94003 /* AzureCommunicationCommon-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AzureCommunicationCommon-Info.plist"; sourceTree = ""; }; 90E843EEA7EA524256A476FB746B05D5 /* Pods-RawVideo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-RawVideo-acknowledgements.markdown"; sourceTree = ""; }; - 9B4AB48D87A2D5EB259713D775C2FB77 /* ACSFeatures.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSFeatures.h; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/ACSFeatures.h"; sourceTree = ""; }; + 9C44C8EDADFA6E433B7C81925D28E90C /* AutoRefreshTokenCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoRefreshTokenCredential.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/AutoRefreshTokenCredential.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9F1D45F077587E698CB0DF0FC42FAF04 /* AzureCommunicationCalling.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AzureCommunicationCalling.release.xcconfig; sourceTree = ""; }; - BC699474FBD176B7042E955935EB3C15 /* ThreadSafeRefreshableAccessTokenCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadSafeRefreshableAccessTokenCache.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/ThreadSafeRefreshableAccessTokenCache.swift; sourceTree = ""; }; - C0F079F3775D360D13C81C640031E566 /* AzureCommunicationCalling-Swift.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "AzureCommunicationCalling-Swift.h"; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/AzureCommunicationCalling-Swift.h"; sourceTree = ""; }; - C5D3EA67E9FCB5DAF05A6CD760266660 /* ACSVideoStreamRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSVideoStreamRenderer.h; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/ACSVideoStreamRenderer.h"; sourceTree = ""; }; + A466E6620626FA1D6EA2B77E31CE9F70 /* CommunicationTokenCredentialProviding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationTokenCredentialProviding.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredentialProviding.swift; sourceTree = ""; }; + B39697E302A224995D285D97607044DB /* AzureCommunicationCommon-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AzureCommunicationCommon-dummy.m"; sourceTree = ""; }; CA2C06E565B2B73B021E4844A77199AD /* Pods-RawVideo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-RawVideo.modulemap"; sourceTree = ""; }; - CEC1308942105BAE1BDEDB06309380CC /* AzureCommunicationCalling.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = AzureCommunicationCalling.xcframework; sourceTree = ""; }; - D5029A2EDAE360351BE72CE2EF8434FC /* CommunicationTokenCredentialProviding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationTokenCredentialProviding.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredentialProviding.swift; sourceTree = ""; }; - D552FED248760C136CE29E180C419DC2 /* AzureCommunicationCommon-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AzureCommunicationCommon-umbrella.h"; sourceTree = ""; }; - D995EE907CE799B917DEF9540CBBD563 /* AzureCommunicationCalling-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "AzureCommunicationCalling-xcframeworks.sh"; sourceTree = ""; }; - DBF87664B2151A5D270D158876FA5CDB /* ACSCallKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSCallKit.h; path = "AzureCommunicationCalling.xcframework/ios-arm64/AzureCommunicationCalling.framework/Headers/ACSCallKit.h"; sourceTree = ""; }; + D3C62B2629A1AF3A33571F2D337C3603 /* CommunicationTokenCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommunicationTokenCredential.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/CommunicationTokenCredential.swift; sourceTree = ""; }; + DA5E45B6984D8D09D199FE4FCE7C27D8 /* AzureCommunicationCommon-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AzureCommunicationCommon-umbrella.h"; sourceTree = ""; }; + E7EAA9242BADE87A90071F3E4A49DA6A /* Identifiers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Identifiers.swift; path = sdk/communication/AzureCommunicationCommon/Source/Identifiers.swift; sourceTree = ""; }; E81180CBF18DF4A4A990E59DCFC1A0BF /* Pods-RawVideo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-RawVideo-frameworks.sh"; sourceTree = ""; }; - EBE5A4DC592748589D73C400974B21FA /* AzureCommunicationCommon-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AzureCommunicationCommon-prefix.pch"; sourceTree = ""; }; EECB5193C32DCB0D67829AFAC24A6AC0 /* Pods-RawVideo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RawVideo.release.xcconfig"; sourceTree = ""; }; - FA9CF3D51655548854CA4F2CBD57E43C /* AutoRefreshTokenCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoRefreshTokenCredential.swift; path = sdk/communication/AzureCommunicationCommon/Source/Authentication/AutoRefreshTokenCredential.swift; sourceTree = ""; }; - FABD1C8B7378919B7DDE30FD7E1C108B /* ACSStreamSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ACSStreamSize.h; path = "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator/AzureCommunicationCalling.framework/Headers/ACSStreamSize.h"; sourceTree = ""; }; + FEF9B7996D87FCD68D08F8B7DF9C8D06 /* AzureCommunicationCommon-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AzureCommunicationCommon-prefix.pch"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 3B961A8B8FA0F0D8B6EE7BA797A0C66F /* Frameworks */ = { + 7BD5010D93617D554F943196078A3D60 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 45FBB6816D4E666E549ECA0DD3FC307C /* Foundation.framework in Frameworks */, + B8814C7C3AF09F92DE0D7075A600EB2A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9F0EE9D335D261B8F540F5F05F77AFEA /* Frameworks */ = { + 9E84AFB5D32E3405B257FEE61E28BCD4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E10F03C7851EFE350F25C337FC73443D /* Foundation.framework in Frameworks */, + B923DF9DA446FF746B965CCCB7C02748 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 18994BFCF634DF0E5589E37855A29214 /* Products */ = { + 0869784EC63610B3B98454D4589C6E97 /* AzureCommunicationCommon */ = { isa = PBXGroup; children = ( - 046BE0A5D32340465034A0DF75B74940 /* AzureCommunicationCommon */, - 838A804A69EEC7B905F1344FEA0EC608 /* Pods-RawVideo */, + 9C44C8EDADFA6E433B7C81925D28E90C /* AutoRefreshTokenCredential.swift */, + 1B8AC0BC2BBE4937BEE5613605AC5EBA /* CommunicationAccessToken.swift */, + 491AE5EC7CF282893D2258232F714236 /* CommunicationCloudEnvironment.swift */, + D3C62B2629A1AF3A33571F2D337C3603 /* CommunicationTokenCredential.swift */, + A466E6620626FA1D6EA2B77E31CE9F70 /* CommunicationTokenCredentialProviding.swift */, + 54FBA3D820DDA68AFE20DDD5D75ACBF0 /* CommunicationTokenRefreshOptions.swift */, + E7EAA9242BADE87A90071F3E4A49DA6A /* Identifiers.swift */, + 078F1026338814E3788D84DC9B88986D /* JwtTokenParser.swift */, + 195F790D44906AE81AA726422748CF69 /* StaticTokenCredential.swift */, + 50765CE7C437193EE2539E683EBD5BB1 /* ThreadSafeRefreshableAccessTokenCache.swift */, + E3E272E861ECB482D9ECEDC8701F0C22 /* Support Files */, ); - name = Products; + name = AzureCommunicationCommon; + path = AzureCommunicationCommon; sourceTree = ""; }; - 20152995E9F06F13EFF60C4463E0120C /* Frameworks */ = { + 18994BFCF634DF0E5589E37855A29214 /* Products */ = { isa = PBXGroup; children = ( - CEC1308942105BAE1BDEDB06309380CC /* AzureCommunicationCalling.xcframework */, + 046BE0A5D32340465034A0DF75B74940 /* AzureCommunicationCommon */, + 838A804A69EEC7B905F1344FEA0EC608 /* Pods-RawVideo */, ); - name = Frameworks; + name = Products; sourceTree = ""; }; 578452D2E740E91742655AC8F1636D1F /* iOS */ = { @@ -159,49 +124,12 @@ name = iOS; sourceTree = ""; }; - 6EC462F0CAA11F80C4D924986F548606 /* Support Files */ = { - isa = PBXGroup; - children = ( - 5134C34AAFBF1CE90FEB5760A7BC0A50 /* AzureCommunicationCommon.modulemap */, - 7628E9E3EE16548309429ECEE3BE28F7 /* AzureCommunicationCommon-dummy.m */, - 894EAD9C5EB681482B77DC5D97B94003 /* AzureCommunicationCommon-Info.plist */, - EBE5A4DC592748589D73C400974B21FA /* AzureCommunicationCommon-prefix.pch */, - D552FED248760C136CE29E180C419DC2 /* AzureCommunicationCommon-umbrella.h */, - 518B277543A2B4860528B26348224DDC /* AzureCommunicationCommon.debug.xcconfig */, - 0D7B006A22F92F4B0A80B01D8CDAB403 /* AzureCommunicationCommon.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AzureCommunicationCommon"; - sourceTree = ""; - }; - 6EED0D7CB94A1FFD0C2BCAF81215CAC8 /* Support Files */ = { - isa = PBXGroup; - children = ( - D995EE907CE799B917DEF9540CBBD563 /* AzureCommunicationCalling-xcframeworks.sh */, - 7D45EC918D28DBF763D7DE828F55940A /* AzureCommunicationCalling.debug.xcconfig */, - 9F1D45F077587E698CB0DF0FC42FAF04 /* AzureCommunicationCalling.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AzureCommunicationCalling"; - sourceTree = ""; - }; - 7AE7C7A9F2F1A5D4803789361B61D7CF /* AzureCommunicationCommon */ = { + 7CEA06DA78A59F2CF84C9FA50AA75AF2 /* Pods */ = { isa = PBXGroup; children = ( - FA9CF3D51655548854CA4F2CBD57E43C /* AutoRefreshTokenCredential.swift */, - 034FAF64E7062FFF1C1ADCC8B84E97C3 /* CommunicationAccessToken.swift */, - 28BFF553CF9ECD0BD5527F4913539AEF /* CommunicationCloudEnvironment.swift */, - 34BA2E9DC9D7E166FE0DC02F9576D7D3 /* CommunicationTokenCredential.swift */, - D5029A2EDAE360351BE72CE2EF8434FC /* CommunicationTokenCredentialProviding.swift */, - 0A43C2F17303BACDDE700DD7571CE12E /* CommunicationTokenRefreshOptions.swift */, - 26CD06013E0B895CC824C20B587B118B /* Identifiers.swift */, - 20C58B353D2B3D0C957416AF3E684126 /* JwtTokenParser.swift */, - 7C9C5FF3D64BEE8C41021B7F2F4C7A19 /* StaticTokenCredential.swift */, - BC699474FBD176B7042E955935EB3C15 /* ThreadSafeRefreshableAccessTokenCache.swift */, - 6EC462F0CAA11F80C4D924986F548606 /* Support Files */, + 0869784EC63610B3B98454D4589C6E97 /* AzureCommunicationCommon */, ); - name = AzureCommunicationCommon; - path = AzureCommunicationCommon; + name = Pods; sourceTree = ""; }; 7FC65B92CE7ABAA9477EE97E5FEA6FD3 /* Pods-RawVideo */ = { @@ -229,21 +157,12 @@ name = "Targets Support Files"; sourceTree = ""; }; - A6B6F2978E73061F4056247C66B6C825 /* Pods */ = { - isa = PBXGroup; - children = ( - EA888C5289385E0E4DD151051E669926 /* AzureCommunicationCalling */, - 7AE7C7A9F2F1A5D4803789361B61D7CF /* AzureCommunicationCommon */, - ); - name = Pods; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - A6B6F2978E73061F4056247C66B6C825 /* Pods */, + 7CEA06DA78A59F2CF84C9FA50AA75AF2 /* Pods */, 18994BFCF634DF0E5589E37855A29214 /* Products */, 8EF9A3C8AAED691E160D69FC01CBB9DD /* Targets Support Files */, ); @@ -257,46 +176,37 @@ name = Frameworks; sourceTree = ""; }; - EA888C5289385E0E4DD151051E669926 /* AzureCommunicationCalling */ = { + E3E272E861ECB482D9ECEDC8701F0C22 /* Support Files */ = { isa = PBXGroup; children = ( - DBF87664B2151A5D270D158876FA5CDB /* ACSCallKit.h */, - 6B33D5791E4EDDCC5281D68EABEC5DE5 /* ACSCallKit.h */, - 56F4637618179036371B462912A0A179 /* ACSFeatures.h */, - 9B4AB48D87A2D5EB259713D775C2FB77 /* ACSFeatures.h */, - 56B635F69F262904C5EA2EAF7C9561F2 /* ACSStreamSize.h */, - FABD1C8B7378919B7DDE30FD7E1C108B /* ACSStreamSize.h */, - 829D8681539D94CC4ADEA97347FC83C5 /* ACSVideoStreamRenderer.h */, - C5D3EA67E9FCB5DAF05A6CD760266660 /* ACSVideoStreamRenderer.h */, - 11AE4CF8B5263A2779FE97EEFEC9393C /* ACSVideoStreamRendererView.h */, - 0EEB8CCA207FD1F37667F022A8C091EA /* ACSVideoStreamRendererView.h */, - 04E3DBF836B80358B6219B3FA389E5D0 /* AzureCommunicationCalling.h */, - 26BF86715ACD7E501647C958C680738D /* AzureCommunicationCalling.h */, - 2013DB12F67E8B77AEB626E064E5F83D /* AzureCommunicationCalling-Swift.h */, - C0F079F3775D360D13C81C640031E566 /* AzureCommunicationCalling-Swift.h */, - 20152995E9F06F13EFF60C4463E0120C /* Frameworks */, - 6EED0D7CB94A1FFD0C2BCAF81215CAC8 /* Support Files */, + 5FBE86FC7DB05E996217A33889FCDB15 /* AzureCommunicationCommon.modulemap */, + B39697E302A224995D285D97607044DB /* AzureCommunicationCommon-dummy.m */, + 67688B7309728FE878BA6BB96887EE19 /* AzureCommunicationCommon-Info.plist */, + FEF9B7996D87FCD68D08F8B7DF9C8D06 /* AzureCommunicationCommon-prefix.pch */, + DA5E45B6984D8D09D199FE4FCE7C27D8 /* AzureCommunicationCommon-umbrella.h */, + 77D70B2EA1BB4841C7E566E021D85486 /* AzureCommunicationCommon.debug.xcconfig */, + 594F1F7B8BBE8FCA4CB6A817605DF034 /* AzureCommunicationCommon.release.xcconfig */, ); - name = AzureCommunicationCalling; - path = AzureCommunicationCalling; + name = "Support Files"; + path = "../Target Support Files/AzureCommunicationCommon"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 73FA76F4D97DC4CA783C0F1F749155D1 /* Headers */ = { + 13710B407E5E767BB693A36E18964D1A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E0A5DAF7298FABD55B939E4076A7EAC9 /* AzureCommunicationCommon-umbrella.h in Headers */, + 1BACECB315BEB1ABAAB1160859D9F2C7 /* AzureCommunicationCommon-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D07BCFB24875D42F51574D5336F2A46F /* Headers */ = { + D29C7AF3AF10979235F16CA21AF6FD03 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 129F19AD0D5D2DBF9AE106C8BD73492C /* Pods-RawVideo-umbrella.h in Headers */, + C6E07F6542C071CF4A78149F7E073229 /* Pods-RawVideo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -305,12 +215,12 @@ /* Begin PBXNativeTarget section */ 07A6CC1D379046F22ADCE2752CDEF14A /* AzureCommunicationCommon */ = { isa = PBXNativeTarget; - buildConfigurationList = F7BAE89538295192DEA20CC470562589 /* Build configuration list for PBXNativeTarget "AzureCommunicationCommon" */; + buildConfigurationList = 5467C1CB70C0470EBA5B864FE52C2C4E /* Build configuration list for PBXNativeTarget "AzureCommunicationCommon" */; buildPhases = ( - 73FA76F4D97DC4CA783C0F1F749155D1 /* Headers */, - 39581DDF0AAF7E36BA77F63C94A8EB3A /* Sources */, - 9F0EE9D335D261B8F540F5F05F77AFEA /* Frameworks */, - A3E2A792E1B8BE0A2C3A8CC22AA9F228 /* Resources */, + 13710B407E5E767BB693A36E18964D1A /* Headers */, + 87BB299BAF5406DD2CADB4A3C92B1755 /* Sources */, + 9E84AFB5D32E3405B257FEE61E28BCD4 /* Frameworks */, + 8A106753D9B9152196BAB70BBF94CDFE /* Resources */, ); buildRules = ( ); @@ -323,18 +233,17 @@ }; EB5CAEE220C6206C8B38C9D1A766D98B /* Pods-RawVideo */ = { isa = PBXNativeTarget; - buildConfigurationList = FADF52A4D49D64F16781545058FA72BF /* Build configuration list for PBXNativeTarget "Pods-RawVideo" */; + buildConfigurationList = B9B0A6D9FEF9C1D218792986AA6CD913 /* Build configuration list for PBXNativeTarget "Pods-RawVideo" */; buildPhases = ( - D07BCFB24875D42F51574D5336F2A46F /* Headers */, - 1FA58CF4C09421D10F2CF703F7931ED0 /* Sources */, - 3B961A8B8FA0F0D8B6EE7BA797A0C66F /* Frameworks */, - B3F2C718BD9E29D0C1855514B712035C /* Resources */, + D29C7AF3AF10979235F16CA21AF6FD03 /* Headers */, + 9F127AEF2B958971B18EB19CF3ADB791 /* Sources */, + 7BD5010D93617D554F943196078A3D60 /* Frameworks */, + 69BC1689F855ACD084F2A498751BE0D0 /* Resources */, ); buildRules = ( ); dependencies = ( - F4CF161478CAC2BCD9D57D5D52FDAA8B /* PBXTargetDependency */, - F6E8EFF00CC75E1FF43EC1E7B1BD19BD /* PBXTargetDependency */, + F1780741E48DACE3BAB0347FF009E576 /* PBXTargetDependency */, ); name = "Pods-RawVideo"; productName = Pods_RawVideo; @@ -363,7 +272,6 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 17D2EB69FA839BA1C46085F1047783CB /* AzureCommunicationCalling */, 07A6CC1D379046F22ADCE2752CDEF14A /* AzureCommunicationCommon */, EB5CAEE220C6206C8B38C9D1A766D98B /* Pods-RawVideo */, ); @@ -371,14 +279,14 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - A3E2A792E1B8BE0A2C3A8CC22AA9F228 /* Resources */ = { + 69BC1689F855ACD084F2A498751BE0D0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - B3F2C718BD9E29D0C1855514B712035C /* Resources */ = { + 8A106753D9B9152196BAB70BBF94CDFE /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -387,73 +295,41 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 4B6724BB9F2E6B8B69BA870D6D2EF397 /* [CP] Copy XCFrameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-input-files.xcfilelist", - ); - name = "[CP] Copy XCFrameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ - 1FA58CF4C09421D10F2CF703F7931ED0 /* Sources */ = { + 87BB299BAF5406DD2CADB4A3C92B1755 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 46EBA36BB26563CC5689198A33BDFED9 /* Pods-RawVideo-dummy.m in Sources */, + 71388BD1ED8AF1D8A73D73B8773CE5DC /* AutoRefreshTokenCredential.swift in Sources */, + 392B40CDBC0E0C7C4A5AC16BFDD65676 /* AzureCommunicationCommon-dummy.m in Sources */, + C97ED0154E26E5215B93D8DFE0E87DF1 /* CommunicationAccessToken.swift in Sources */, + 2087E27F0CDECB11105AA8084FF123F4 /* CommunicationCloudEnvironment.swift in Sources */, + F58CFBF5379CBD86B4893BBE99C30049 /* CommunicationTokenCredential.swift in Sources */, + 83B2CAD54477B8D72B3DF93510C21561 /* CommunicationTokenCredentialProviding.swift in Sources */, + 51C5CF129B1B419841F90C2C86315D8C /* CommunicationTokenRefreshOptions.swift in Sources */, + F2B845F3D16A3D0549BD079B3C7CC7CE /* Identifiers.swift in Sources */, + 3DCD51389CE17BF0F8617A3B3FAE9DBC /* JwtTokenParser.swift in Sources */, + 5F05C402101473F90DE8C3FFA5A77DBE /* StaticTokenCredential.swift in Sources */, + 063BBFD310C4FAA91628665CB77DDBF3 /* ThreadSafeRefreshableAccessTokenCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 39581DDF0AAF7E36BA77F63C94A8EB3A /* Sources */ = { + 9F127AEF2B958971B18EB19CF3ADB791 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - FACD2FFC72B1A711C4F0C1F015427038 /* AutoRefreshTokenCredential.swift in Sources */, - B4697E753C880880D0E8EC6A506E9A80 /* AzureCommunicationCommon-dummy.m in Sources */, - DD62BDCF116841F8198DA7375F8A54DB /* CommunicationAccessToken.swift in Sources */, - FEC1217A4EA7D77D6852E29BE12FBFCD /* CommunicationCloudEnvironment.swift in Sources */, - E8D2517ECD2E28E543DF3A861CD109F6 /* CommunicationTokenCredential.swift in Sources */, - 9D8A18ED7F49D7F10731DE28F2FADBD0 /* CommunicationTokenCredentialProviding.swift in Sources */, - 441D236ACB1828D06E3192524A0766A9 /* CommunicationTokenRefreshOptions.swift in Sources */, - 433318E3C668C684F7505A594944F6D8 /* Identifiers.swift in Sources */, - 3398B951E6CF6A3001269C359557A3E5 /* JwtTokenParser.swift in Sources */, - 5B698DC33678A01C35FF4F23EC157483 /* StaticTokenCredential.swift in Sources */, - 9F388D282F4BE59048F82B41CBBEDF70 /* ThreadSafeRefreshableAccessTokenCache.swift in Sources */, + DF15588A1BB9E593C7B03AA58951C2BD /* Pods-RawVideo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 9138D34950B4667210D1EB4BD1B242D3 /* PBXTargetDependency */ = { + F1780741E48DACE3BAB0347FF009E576 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AzureCommunicationCommon; target = 07A6CC1D379046F22ADCE2752CDEF14A /* AzureCommunicationCommon */; - targetProxy = 935D716FEBCE092A194C705C91B58406 /* PBXContainerItemProxy */; - }; - F4CF161478CAC2BCD9D57D5D52FDAA8B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = AzureCommunicationCalling; - target = 17D2EB69FA839BA1C46085F1047783CB /* AzureCommunicationCalling */; - targetProxy = E521074A60E34ECF52535D236CAE0A1A /* PBXContainerItemProxy */; - }; - F6E8EFF00CC75E1FF43EC1E7B1BD19BD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = AzureCommunicationCommon; - target = 07A6CC1D379046F22ADCE2752CDEF14A /* AzureCommunicationCommon */; - targetProxy = 2DE1A29AA2CCDAFB546D0D10E00C0279 /* PBXContainerItemProxy */; + targetProxy = 2784BDD4D27BC0496B2B443348DA6A31 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -520,9 +396,9 @@ }; name = Release; }; - 4777FA1C4A841740AB53FA99EF2E2B3F /* Release */ = { + 414C3C2C226F8B5C14DFDBEC8EDB8491 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0D7B006A22F92F4B0A80B01D8CDAB403 /* AzureCommunicationCommon.release.xcconfig */; + baseConfigurationReference = 594F1F7B8BBE8FCA4CB6A817605DF034 /* AzureCommunicationCommon.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -555,9 +431,9 @@ }; name = Release; }; - 5BCAF5F343BB7F9AA209DED7A7FB4CED /* Debug */ = { + 92930649BAC42F96D7420CD7F4E35527 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 518B277543A2B4860528B26348224DDC /* AzureCommunicationCommon.debug.xcconfig */; + baseConfigurationReference = 77D70B2EA1BB4841C7E566E021D85486 /* AzureCommunicationCommon.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -589,24 +465,7 @@ }; name = Debug; }; - 612B008F15D491116D6A303A874E8437 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7D45EC918D28DBF763D7DE828F55940A /* AzureCommunicationCalling.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ENABLE_OBJC_WEAK = NO; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - A538A025FF34514F93C52CC645C24EDC /* Debug */ = { + 9BBEB4167EBDE11B5930812604180A2E /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 406E79335486643876B80FFA2C567C71 /* Pods-RawVideo.debug.xcconfig */; buildSettings = { @@ -643,7 +502,7 @@ }; name = Debug; }; - ACC9365EB27535A8060F45AB664473C4 /* Release */ = { + E8546D4E2C49D4FF2EF4701CC0916149 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = EECB5193C32DCB0D67829AFAC24A6AC0 /* Pods-RawVideo.release.xcconfig */; buildSettings = { @@ -681,24 +540,6 @@ }; name = Release; }; - BB49314120BFD501DAB22BFE0EADE069 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F1D45F077587E698CB0DF0FC42FAF04 /* AzureCommunicationCalling.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ENABLE_OBJC_WEAK = NO; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; F4FF6A0D1970CA9705974E3CB2134802 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -777,29 +618,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9B8484DC33D295C398D28B22A2965560 /* Build configuration list for PBXAggregateTarget "AzureCommunicationCalling" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 612B008F15D491116D6A303A874E8437 /* Debug */, - BB49314120BFD501DAB22BFE0EADE069 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - F7BAE89538295192DEA20CC470562589 /* Build configuration list for PBXNativeTarget "AzureCommunicationCommon" */ = { + 5467C1CB70C0470EBA5B864FE52C2C4E /* Build configuration list for PBXNativeTarget "AzureCommunicationCommon" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5BCAF5F343BB7F9AA209DED7A7FB4CED /* Debug */, - 4777FA1C4A841740AB53FA99EF2E2B3F /* Release */, + 92930649BAC42F96D7420CD7F4E35527 /* Debug */, + 414C3C2C226F8B5C14DFDBEC8EDB8491 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FADF52A4D49D64F16781545058FA72BF /* Build configuration list for PBXNativeTarget "Pods-RawVideo" */ = { + B9B0A6D9FEF9C1D218792986AA6CD913 /* Build configuration list for PBXNativeTarget "Pods-RawVideo" */ = { isa = XCConfigurationList; buildConfigurations = ( - A538A025FF34514F93C52CC645C24EDC /* Debug */, - ACC9365EB27535A8060F45AB664473C4 /* Release */, + 9BBEB4167EBDE11B5930812604180A2E /* Debug */, + E8546D4E2C49D4FF2EF4701CC0916149 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/AzureCommunicationCalling.xcscheme b/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/AzureCommunicationCalling.xcscheme deleted file mode 100644 index 8f1a7bc..0000000 --- a/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/AzureCommunicationCalling.xcscheme +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist b/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist index b6bad30..7ae410c 100644 --- a/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/raw-video/Pods/Pods.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,26 +4,19 @@ SchemeUserState - AzureCommunicationCalling.xcscheme - - isShown - - orderHint - 0 - AzureCommunicationCommon.xcscheme isShown orderHint - 1 + 0 Pods-RawVideo.xcscheme isShown orderHint - 2 + 1 SuppressBuildableAutocreation diff --git a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-input-files.xcfilelist b/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-input-files.xcfilelist deleted file mode 100644 index 27e07fe..0000000 --- a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-input-files.xcfilelist +++ /dev/null @@ -1,2 +0,0 @@ -${PODS_ROOT}/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks.sh -${PODS_ROOT}/AzureCommunicationCalling/AzureCommunicationCalling.xcframework \ No newline at end of file diff --git a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-output-files.xcfilelist b/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-output-files.xcfilelist deleted file mode 100644 index 3cfcc73..0000000 --- a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks-output-files.xcfilelist +++ /dev/null @@ -1 +0,0 @@ -${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling/AzureCommunicationCalling.framework \ No newline at end of file diff --git a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks.sh b/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks.sh deleted file mode 100755 index cced515..0000000 --- a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling-xcframeworks.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -function on_error { - echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" -} -trap 'on_error $LINENO' ERR - - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - - -variant_for_slice() -{ - case "$1" in - "AzureCommunicationCalling.xcframework/ios-arm64") - echo "" - ;; - "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator") - echo "simulator" - ;; - esac -} - -archs_for_slice() -{ - case "$1" in - "AzureCommunicationCalling.xcframework/ios-arm64") - echo "arm64" - ;; - "AzureCommunicationCalling.xcframework/ios-arm64_x86_64-simulator") - echo "arm64 x86_64" - ;; - esac -} - -copy_dir() -{ - local source="$1" - local destination="$2" - - # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" -} - -SELECT_SLICE_RETVAL="" - -select_slice() { - local xcframework_name="$1" - xcframework_name="${xcframework_name##*/}" - local paths=("${@:2}") - # Locate the correct slice of the .xcframework for the current architectures - local target_path="" - - # Split archs on space so we can find a slice that has all the needed archs - local target_archs=$(echo $ARCHS | tr " " "\n") - - local target_variant="" - if [[ "$PLATFORM_NAME" == *"simulator" ]]; then - target_variant="simulator" - fi - if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then - target_variant="maccatalyst" - fi - for i in ${!paths[@]}; do - local matched_all_archs="1" - local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" - local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" - for target_arch in $target_archs; do - if ! [[ "${slice_variant}" == "$target_variant" ]]; then - matched_all_archs="0" - break - fi - - if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then - matched_all_archs="0" - break - fi - done - - if [[ "$matched_all_archs" == "1" ]]; then - # Found a matching slice - echo "Selected xcframework slice ${paths[$i]}" - SELECT_SLICE_RETVAL=${paths[$i]} - break - fi - done -} - -install_xcframework() { - local basepath="$1" - local name="$2" - local package_type="$3" - local paths=("${@:4}") - - # Locate the correct slice of the .xcframework for the current architectures - select_slice "${basepath}" "${paths[@]}" - local target_path="$SELECT_SLICE_RETVAL" - if [[ -z "$target_path" ]]; then - echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." - return - fi - local source="$basepath/$target_path" - - local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" - - if [ ! -d "$destination" ]; then - mkdir -p "$destination" - fi - - copy_dir "$source/" "$destination" - echo "Copied $source to $destination" -} - -install_xcframework "${PODS_ROOT}/AzureCommunicationCalling/AzureCommunicationCalling.xcframework" "AzureCommunicationCalling" "framework" "ios-arm64" "ios-arm64_x86_64-simulator" - diff --git a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling.debug.xcconfig b/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling.debug.xcconfig deleted file mode 100644 index f9ae135..0000000 --- a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling.debug.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCalling -DEFINES_MODULE = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon" "${PODS_ROOT}/AzureCommunicationCalling" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/AzureCommunicationCalling -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling.release.xcconfig b/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling.release.xcconfig deleted file mode 100644 index f9ae135..0000000 --- a/raw-video/Pods/Target Support Files/AzureCommunicationCalling/AzureCommunicationCalling.release.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCalling -DEFINES_MODULE = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon" "${PODS_ROOT}/AzureCommunicationCalling" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/AzureCommunicationCalling -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/raw-video/Pods/Target Support Files/AzureCommunicationCommon/AzureCommunicationCommon-Info.plist b/raw-video/Pods/Target Support Files/AzureCommunicationCommon/AzureCommunicationCommon-Info.plist index de6ebe8..c2e6784 100644 --- a/raw-video/Pods/Target Support Files/AzureCommunicationCommon/AzureCommunicationCommon-Info.plist +++ b/raw-video/Pods/Target Support Files/AzureCommunicationCommon/AzureCommunicationCommon-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1.1 + 1.2.0 CFBundleSignature ???? CFBundleVersion diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.markdown b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.markdown index 4910972..0e5610b 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.markdown +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.markdown @@ -1,89 +1,6 @@ # Acknowledgements This application makes use of the following third party libraries: -## AzureCommunicationCalling - -MICROSOFT SOFTWARE LICENSE TERMS -AZURE COMMUNICATION SERVICES VOICE AND VIDEO CALLING CLIENT LIBRARY - -IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE UNITED STATES, PLEASE READ THE “BINDING ARBITRATION AND CLASS ACTION WAIVER” SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED. -These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. -1. INSTALLATION AND USE RIGHTS. -a) General. You may install and use any number of copies of the software on your devices. -b) Included Microsoft Applications. The software may include other Microsoft applications. These license terms apply to those included applications, if any, unless other license terms are provided with the other Microsoft applications. -c) Third Party Components. The software may include third party components with separate legal notices or governed by other agreements, as may be described in the ThirdPartyNotices file(s) accompanying the software. -d) Competitive Benchmarking. If you are a direct competitor, and you access or use the software for purposes of competitive benchmarking, analysis, or intelligence gathering, you waive as against Microsoft, its subsidiaries, and its affiliated companies (including prospectively) any competitive use, access, and benchmarking test restrictions in the terms governing your software to the extent your terms of use are, or purport to be, more restrictive than Microsoft’s terms. If you do not waive any such purported restrictions in the terms governing your software, you are not allowed to access or use this software, and will not do so. -2. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): -a) work around any technical limitations in the software that only allow you to use it in certain ways; -b) reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; -d) use the software in any way that is against the law or to create or propagate malware; or -e) share, publish, distribute, or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. -3. PRE-RELEASE SOFTWARE. The software is a pre-release version. It may not operate correctly. It may be different from the commercially released version. -4. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license that requires Microsoft to license its software or documentation to third parties because Microsoft includes your feedback in them. These rights survive this agreement. -5. DATA. -a) Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation. There are also some features in the software that may enable you to collect data from users of your applications. If you use these features to enable data collection in your applications, you must comply with applicable law, including providing appropriate notices to users of your applications. You can learn more about data collection and use in the help documentation and the privacy statement at https://aka.ms/privacy. Your use of the software operates as your consent to these practices. -b) Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at https://docs.microsoft.com/en-us/legal/gdpr. -6. CODE OF CONDUCT. By agreeing to these license terms, you’re agreeing that, when using the software, you will follow these rules: -a) Don’t do anything illegal. -b) Don’t engage in any activity that exploits, harms, or threatens to harm children. -c) Don’t send spam. Spam is unwanted or unsolicited bulk email, postings, contact requests, SMS (text messages), or instant messages. -d) Don’t publicly display or use the software to share inappropriate content or material (involving, for example, nudity, bestiality, pornography, offensive language, graphic violence, or criminal activity). -e) Don’t engage in activity that is fraudulent, false or misleading (e.g., asking for money under false pretenses, impersonating someone else, manipulating the software to increase play count, or affect rankings, ratings, or comments). -f) Don’t circumvent any restrictions on access to or availability of the software. -g) Don’t engage in activity that is harmful to you, the software, or others (e.g., transmitting viruses, stalking, posting terrorist content, communicating hate speech, or advocating violence against others). -h) Don’t infringe upon the rights of others (e.g., unauthorized sharing of copyrighted music or other copyrighted material, resale or other distribution of Bing maps, or photographs). -i) Don’t engage in activity that violates the privacy of others. -j) Don’t help others break these rules. -7. VIDEO CODECS. THIS PRODUCT IS LICENSED UNDER THE AVC, THE VC-1, AND THE MPEG-4 PART 2 VISUAL PATENT PORTFOLIO LICENSES FOR THE PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE ABOVE STANDARDS (“VIDEO STANDARDS”) OR (ii) DECODE AVC, VC-1, AND MPEG-4 PART 2 VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL ACTIVITY OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE SUCH VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE https://aka.ms/mpegla. -8. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit https://aka.ms/exporting. -9. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. -10. UPDATES. The software may periodically check for updates, and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. -11. BINDING ARBITRATION AND CLASS ACTION WAIVER. This Section applies if you live in (or, if a business, your principal place of business is in) the United States. If you and Microsoft have a dispute, you and Microsoft agree to try for 60 days to resolve it informally. If you and Microsoft can’t, you and Microsoft agree to binding individual arbitration before the American Arbitration Association under the Federal Arbitration Act (“FAA”), and not to sue in court in front of a judge or jury. Instead, a neutral arbitrator will decide. Class action lawsuits, class-wide arbitrations, private attorney-general actions, and any other proceeding where someone acts in a representative capacity are not allowed; nor is combining individual proceedings without the consent of all parties. The complete Arbitration Agreement contains more terms and is at https://aka.ms/arb-agreement-4. You and Microsoft agree to these terms. -12. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts. -13. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. -14. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles, except that the FAA governs everything related to arbitration. If you acquired the software in any other country, its laws apply, except that the FAA governs everything related to arbitration. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court (excluding arbitration). If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court (excluding arbitration). -15. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: -a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. -b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. -c) Germany and Austria. -i. Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. -ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. -Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called “cardinal obligations”). In other cases of slight negligence, Microsoft will not be liable for slight negligence. -16. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -17. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. -It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. -18. CONFIDENTIAL INFORMATION. The software, including its user interface, features and documentation, is confidential and proprietary to Microsoft and its suppliers. -a) Use. For five years after installation of the software or its commercial release, whichever is first, you may not disclose confidential information to third parties. You may disclose confidential information only to your employees and consultants who need to know the information. You must have written agreements with them that protect the confidential information at least as much as this agreement. -b) Survival. Your duty to protect confidential information survives this agreement. -c) Exclusions. You may disclose confidential information in response to a judicial or governmental order. You must first give written notice to Microsoft to allow it to seek a protective order or otherwise protect the information. Confidential information does not include information that: -i. becomes publicly known through no wrongful act; -ii. you received from a third party who did not breach confidentiality obligations to Microsoft or its suppliers; or -iii. you developed independently. - -Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. -Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. -Cette limitation concerne: -• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et -• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. - - - - -DWT 28909257v1 0085000-001126 - - - - - -DWT 28909257v1 0085000-001126 - - ## AzureCommunicationCommon MIT License diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.plist b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.plist index 53e8eb7..ce4964b 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.plist +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-acknowledgements.plist @@ -12,95 +12,6 @@ Type PSGroupSpecifier - - FooterText - MICROSOFT SOFTWARE LICENSE TERMS -AZURE COMMUNICATION SERVICES VOICE AND VIDEO CALLING CLIENT LIBRARY - -IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE UNITED STATES, PLEASE READ THE “BINDING ARBITRATION AND CLASS ACTION WAIVER” SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED. -These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. -1. INSTALLATION AND USE RIGHTS. -a) General. You may install and use any number of copies of the software on your devices. -b) Included Microsoft Applications. The software may include other Microsoft applications. These license terms apply to those included applications, if any, unless other license terms are provided with the other Microsoft applications. -c) Third Party Components. The software may include third party components with separate legal notices or governed by other agreements, as may be described in the ThirdPartyNotices file(s) accompanying the software. -d) Competitive Benchmarking. If you are a direct competitor, and you access or use the software for purposes of competitive benchmarking, analysis, or intelligence gathering, you waive as against Microsoft, its subsidiaries, and its affiliated companies (including prospectively) any competitive use, access, and benchmarking test restrictions in the terms governing your software to the extent your terms of use are, or purport to be, more restrictive than Microsoft’s terms. If you do not waive any such purported restrictions in the terms governing your software, you are not allowed to access or use this software, and will not do so. -2. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): -a) work around any technical limitations in the software that only allow you to use it in certain ways; -b) reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; -d) use the software in any way that is against the law or to create or propagate malware; or -e) share, publish, distribute, or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. -3. PRE-RELEASE SOFTWARE. The software is a pre-release version. It may not operate correctly. It may be different from the commercially released version. -4. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license that requires Microsoft to license its software or documentation to third parties because Microsoft includes your feedback in them. These rights survive this agreement. -5. DATA. -a) Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation. There are also some features in the software that may enable you to collect data from users of your applications. If you use these features to enable data collection in your applications, you must comply with applicable law, including providing appropriate notices to users of your applications. You can learn more about data collection and use in the help documentation and the privacy statement at https://aka.ms/privacy. Your use of the software operates as your consent to these practices. -b) Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at https://docs.microsoft.com/en-us/legal/gdpr. -6. CODE OF CONDUCT. By agreeing to these license terms, you’re agreeing that, when using the software, you will follow these rules: -a) Don’t do anything illegal. -b) Don’t engage in any activity that exploits, harms, or threatens to harm children. -c) Don’t send spam. Spam is unwanted or unsolicited bulk email, postings, contact requests, SMS (text messages), or instant messages. -d) Don’t publicly display or use the software to share inappropriate content or material (involving, for example, nudity, bestiality, pornography, offensive language, graphic violence, or criminal activity). -e) Don’t engage in activity that is fraudulent, false or misleading (e.g., asking for money under false pretenses, impersonating someone else, manipulating the software to increase play count, or affect rankings, ratings, or comments). -f) Don’t circumvent any restrictions on access to or availability of the software. -g) Don’t engage in activity that is harmful to you, the software, or others (e.g., transmitting viruses, stalking, posting terrorist content, communicating hate speech, or advocating violence against others). -h) Don’t infringe upon the rights of others (e.g., unauthorized sharing of copyrighted music or other copyrighted material, resale or other distribution of Bing maps, or photographs). -i) Don’t engage in activity that violates the privacy of others. -j) Don’t help others break these rules. -7. VIDEO CODECS. THIS PRODUCT IS LICENSED UNDER THE AVC, THE VC-1, AND THE MPEG-4 PART 2 VISUAL PATENT PORTFOLIO LICENSES FOR THE PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE ABOVE STANDARDS (“VIDEO STANDARDS”) OR (ii) DECODE AVC, VC-1, AND MPEG-4 PART 2 VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL ACTIVITY OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE SUCH VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE https://aka.ms/mpegla. -8. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit https://aka.ms/exporting. -9. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. -10. UPDATES. The software may periodically check for updates, and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. -11. BINDING ARBITRATION AND CLASS ACTION WAIVER. This Section applies if you live in (or, if a business, your principal place of business is in) the United States. If you and Microsoft have a dispute, you and Microsoft agree to try for 60 days to resolve it informally. If you and Microsoft can’t, you and Microsoft agree to binding individual arbitration before the American Arbitration Association under the Federal Arbitration Act (“FAA”), and not to sue in court in front of a judge or jury. Instead, a neutral arbitrator will decide. Class action lawsuits, class-wide arbitrations, private attorney-general actions, and any other proceeding where someone acts in a representative capacity are not allowed; nor is combining individual proceedings without the consent of all parties. The complete Arbitration Agreement contains more terms and is at https://aka.ms/arb-agreement-4. You and Microsoft agree to these terms. -12. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts. -13. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. -14. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles, except that the FAA governs everything related to arbitration. If you acquired the software in any other country, its laws apply, except that the FAA governs everything related to arbitration. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court (excluding arbitration). If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court (excluding arbitration). -15. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: -a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. -b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. -c) Germany and Austria. -i. Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. -ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. -Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called “cardinal obligations”). In other cases of slight negligence, Microsoft will not be liable for slight negligence. -16. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -17. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. -It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. -18. CONFIDENTIAL INFORMATION. The software, including its user interface, features and documentation, is confidential and proprietary to Microsoft and its suppliers. -a) Use. For five years after installation of the software or its commercial release, whichever is first, you may not disclose confidential information to third parties. You may disclose confidential information only to your employees and consultants who need to know the information. You must have written agreements with them that protect the confidential information at least as much as this agreement. -b) Survival. Your duty to protect confidential information survives this agreement. -c) Exclusions. You may disclose confidential information in response to a judicial or governmental order. You must first give written notice to Microsoft to allow it to seek a protective order or otherwise protect the information. Confidential information does not include information that: -i. becomes publicly known through no wrongful act; -ii. you received from a third party who did not breach confidentiality obligations to Microsoft or its suppliers; or -iii. you developed independently. - -Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. -Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. -Cette limitation concerne: -• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et -• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. - - - - -DWT 28909257v1 0085000-001126 - - - - - -DWT 28909257v1 0085000-001126 - - License - Commercial - Title - AzureCommunicationCalling - Type - PSGroupSpecifier - FooterText MIT License diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-input-files.xcfilelist b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-input-files.xcfilelist index 053d6f3..1f1655f 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-input-files.xcfilelist +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-input-files.xcfilelist @@ -1,3 +1,2 @@ ${PODS_ROOT}/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks.sh -${BUILT_PRODUCTS_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework -${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling/AzureCommunicationCalling.framework/AzureCommunicationCalling \ No newline at end of file +${BUILT_PRODUCTS_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework \ No newline at end of file diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-output-files.xcfilelist b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-output-files.xcfilelist index cbdc435..161df88 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-output-files.xcfilelist +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Debug-output-files.xcfilelist @@ -1,2 +1 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AzureCommunicationCommon.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AzureCommunicationCalling.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AzureCommunicationCommon.framework \ No newline at end of file diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-input-files.xcfilelist b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-input-files.xcfilelist index 053d6f3..1f1655f 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-input-files.xcfilelist +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-input-files.xcfilelist @@ -1,3 +1,2 @@ ${PODS_ROOT}/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks.sh -${BUILT_PRODUCTS_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework -${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling/AzureCommunicationCalling.framework/AzureCommunicationCalling \ No newline at end of file +${BUILT_PRODUCTS_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework \ No newline at end of file diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-output-files.xcfilelist b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-output-files.xcfilelist index cbdc435..161df88 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-output-files.xcfilelist +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks-Release-output-files.xcfilelist @@ -1,2 +1 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AzureCommunicationCommon.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AzureCommunicationCalling.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AzureCommunicationCommon.framework \ No newline at end of file diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks.sh b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks.sh index d51a28f..b8b0af1 100755 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks.sh +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo-frameworks.sh @@ -177,11 +177,9 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework" - install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling/AzureCommunicationCalling.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework" - install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling/AzureCommunicationCalling.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.debug.xcconfig b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.debug.xcconfig index b0ccdbc..de3de54 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.debug.xcconfig +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon" "${PODS_ROOT}/AzureCommunicationCalling" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "AzureCommunicationCalling" -framework "AzureCommunicationCommon" +OTHER_LDFLAGS = $(inherited) -framework "AzureCommunicationCommon" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.release.xcconfig b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.release.xcconfig index b0ccdbc..de3de54 100644 --- a/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.release.xcconfig +++ b/raw-video/Pods/Target Support Files/Pods-RawVideo/Pods-RawVideo.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon" "${PODS_ROOT}/AzureCommunicationCalling" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AzureCommunicationCalling" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon/AzureCommunicationCommon.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "AzureCommunicationCalling" -framework "AzureCommunicationCommon" +OTHER_LDFLAGS = $(inherited) -framework "AzureCommunicationCommon" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/raw-video/RawVideo.xcodeproj/project.pbxproj b/raw-video/RawVideo.xcodeproj/project.pbxproj index ba8df19..920beda 100644 --- a/raw-video/RawVideo.xcodeproj/project.pbxproj +++ b/raw-video/RawVideo.xcodeproj/project.pbxproj @@ -17,9 +17,26 @@ 99134B002B6C6916002D81F4 /* CameraCaptureService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99134AFF2B6C6916002D81F4 /* CameraCaptureService.swift */; }; 99134B022B6C6925002D81F4 /* CaptureService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99134B012B6C6925002D81F4 /* CaptureService.swift */; }; 99134B082B6D48F5002D81F4 /* CaptureServiceDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99134B072B6D48F5002D81F4 /* CaptureServiceDelegate.swift */; }; + 993687202B9F5C8000714A2A /* VideoFrameGeneratorService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9936871F2B9F5C8000714A2A /* VideoFrameGeneratorService.swift */; }; + 99BDF5982BD34F200007AC2F /* AzureCommunicationCalling.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99BDF5972BD34F200007AC2F /* AzureCommunicationCalling.framework */; }; + 99BDF5992BD34F200007AC2F /* AzureCommunicationCalling.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 99BDF5972BD34F200007AC2F /* AzureCommunicationCalling.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C564341B8E8E6E67A95575C4 /* Pods_RawVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CA9F47B316E39FEA163F585 /* Pods_RawVideo.framework */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + 99BDF5952BD34E490007AC2F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 99BDF5992BD34F200007AC2F /* AzureCommunicationCalling.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 063CF56129D53E56004C9E20 /* RawVideo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RawVideo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 063CF56429D53E56004C9E20 /* RawVideoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawVideoApp.swift; sourceTree = ""; }; @@ -35,6 +52,8 @@ 99134AFF2B6C6916002D81F4 /* CameraCaptureService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraCaptureService.swift; sourceTree = ""; }; 99134B012B6C6925002D81F4 /* CaptureService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureService.swift; sourceTree = ""; }; 99134B072B6D48F5002D81F4 /* CaptureServiceDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureServiceDelegate.swift; sourceTree = ""; }; + 9936871F2B9F5C8000714A2A /* VideoFrameGeneratorService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoFrameGeneratorService.swift; sourceTree = ""; }; + 99BDF5972BD34F200007AC2F /* AzureCommunicationCalling.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AzureCommunicationCalling.framework; path = "../../../../../../Skype/iOS/GA/SpoolCallingStack/native/staging.d/release/GA/sdk/arm64-v8a/AzureCommunicationCalling.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -42,6 +61,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 99BDF5982BD34F200007AC2F /* AzureCommunicationCalling.framework in Frameworks */, C564341B8E8E6E67A95575C4 /* Pods_RawVideo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -80,6 +100,7 @@ 99134AFF2B6C6916002D81F4 /* CameraCaptureService.swift */, 99134B012B6C6925002D81F4 /* CaptureService.swift */, 99134B072B6D48F5002D81F4 /* CaptureServiceDelegate.swift */, + 9936871F2B9F5C8000714A2A /* VideoFrameGeneratorService.swift */, ); path = RawVideo; sourceTree = ""; @@ -95,6 +116,7 @@ 063CF57229D53EBE004C9E20 /* Frameworks */ = { isa = PBXGroup; children = ( + 99BDF5972BD34F200007AC2F /* AzureCommunicationCalling.framework */, 8CA9F47B316E39FEA163F585 /* Pods_RawVideo.framework */, ); name = Frameworks; @@ -121,6 +143,7 @@ 063CF55E29D53E56004C9E20 /* Frameworks */, 063CF55F29D53E56004C9E20 /* Resources */, 6939D39E22826F4B3D1448F5 /* [CP] Embed Pods Frameworks */, + 99BDF5952BD34E490007AC2F /* Embed Frameworks */, ); buildRules = ( ); @@ -231,6 +254,7 @@ 06C279D729F1DF3500C65641 /* VideoStreamView.swift in Sources */, 06C279D929F1E6D100C65641 /* RawVideoFrameView.swift in Sources */, 99134B082B6D48F5002D81F4 /* CaptureServiceDelegate.swift in Sources */, + 993687202B9F5C8000714A2A /* VideoFrameGeneratorService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -369,6 +393,7 @@ "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics\"", "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core\"", "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes\"", + "/Users/bisteni/Skype/iOS/GA/SpoolCallingStack/native/staging.d/release/GA/sdk/arm64-v8a", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSCameraUsageDescription = "Camera access is needed to make video call"; @@ -402,6 +427,11 @@ DEVELOPMENT_ASSET_PATHS = "\"RawVideo/Preview Content\""; DEVELOPMENT_TEAM = UBF8T346G9; ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/AzureCommunicationCommon\"", + "/Users/bisteni/Skype/iOS/GA/SpoolCallingStack/native/staging.d/release/GA/sdk/arm64-v8a", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSCameraUsageDescription = "Camera access is needed to make video call"; INFOPLIST_KEY_NSMicrophoneUsageDescription = "Microphone access is needed to make video call"; diff --git a/raw-video/RawVideo.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist b/raw-video/RawVideo.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist index 0ff891e..4c381bf 100644 --- a/raw-video/RawVideo.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/raw-video/RawVideo.xcodeproj/xcuserdata/bisteni.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ RawVideo.xcscheme_^#shared#^_ orderHint - 3 + 2 diff --git a/raw-video/RawVideo.xcworkspace/xcuserdata/bisteni.xcuserdatad/UserInterfaceState.xcuserstate b/raw-video/RawVideo.xcworkspace/xcuserdata/bisteni.xcuserdatad/UserInterfaceState.xcuserstate index db87523..9a15237 100644 Binary files a/raw-video/RawVideo.xcworkspace/xcuserdata/bisteni.xcuserdatad/UserInterfaceState.xcuserstate and b/raw-video/RawVideo.xcworkspace/xcuserdata/bisteni.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/raw-video/RawVideo/CameraCaptureService.swift b/raw-video/RawVideo/CameraCaptureService.swift index def494c..59ee4b8 100644 --- a/raw-video/RawVideo/CameraCaptureService.swift +++ b/raw-video/RawVideo/CameraCaptureService.swift @@ -12,17 +12,57 @@ import UIKit import SwiftUI import AzureCommunicationCalling +extension Array where Element: Hashable +{ + func unique() -> [Element] + { + Array(Set(self)) + } +} + +extension CGSize : Hashable +{ + public func hash(into hasher: inout Hasher) + { + hasher.combine(width) + hasher.combine(height) + } +} + +struct VideoFormatBundle : Hashable +{ + let size: CGSize + let format: AVCaptureDevice.Format + + public func hash(into hasher: inout Hasher) + { + hasher.combine(size) + } + + static func == (lo: VideoFormatBundle, ro: VideoFormatBundle) -> Bool + { + return lo.size == ro.size + } +} + class CameraCaptureService : CaptureService, AVCaptureVideoDataOutputSampleBufferDelegate { - var camera: AVCaptureDevice? - var captureSession: AVCaptureSession = AVCaptureSession() + var camera: AVCaptureDevice + var captureSession: AVCaptureSession var previewLayer: AVCaptureVideoPreviewLayer? + var format: AVCaptureDevice.Format - func Start(camera: AVCaptureDevice) -> Void + init(stream: RawOutgoingVideoStream, camera: AVCaptureDevice, format: AVCaptureDevice.Format) { self.camera = camera - captureSession.sessionPreset = AVCaptureSession.Preset.vga640x480 - + self.format = format + captureSession = AVCaptureSession() + + super.init(stream: stream) + } + + func Start() -> Void + { do { let videoInput = try AVCaptureDeviceInput(device: camera) @@ -44,8 +84,25 @@ class CameraCaptureService : CaptureService, AVCaptureVideoDataOutputSampleBuffe let queue = DispatchQueue(label: "com.microsoft.RawVideo.CameraCaptureDelegate") videoOutput.setSampleBufferDelegate(self, queue: queue) - videoOutput.videoSettings = [String(kCVPixelBufferPixelFormatTypeKey) : UInt(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)] - + videoOutput.videoSettings = [String(kCVPixelBufferPixelFormatTypeKey) : + UInt(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)] + + captureSession.beginConfiguration() + do + { + try camera.lockForConfiguration() + camera.activeFormat = format + camera.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 30) + camera.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: 30) + camera.unlockForConfiguration() + } + catch + { + print(error.localizedDescription) + return + } + + captureSession.commitConfiguration() captureSession.startRunning() } @@ -54,13 +111,15 @@ class CameraCaptureService : CaptureService, AVCaptureVideoDataOutputSampleBuffe captureSession.stopRunning() } - func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) + func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, + from connection: AVCaptureConnection) { - guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { + guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else + { return } - let format = rawOutgoingVideoStream.format + let format = stream.format if format != nil { let rawVideoFrameBuffer = RawVideoFrameBuffer() @@ -84,4 +143,49 @@ class CameraCaptureService : CaptureService, AVCaptureVideoDataOutputSampleBuffe return session.devices } + + public static func GetSuportedVideoFormats(camera: AVCaptureDevice) -> Array + { + let resolutionList = [ + VideoStreamResolution.p1080, + VideoStreamResolution.p720, + VideoStreamResolution.p540, + VideoStreamResolution.p480, + VideoStreamResolution.p360, + VideoStreamResolution.p270, + VideoStreamResolution.p240, + VideoStreamResolution.p108, + VideoStreamResolution.fullHd, + VideoStreamResolution.hd, + VideoStreamResolution.vga, + VideoStreamResolution.qvga + ] + + let acsFormatList = resolutionList + .map({ x in + let format = VideoStreamFormat() + format.resolution = x + + return CGSize(width: Double(format.width), + height: Double(format.height)) + }) + .unique() + + return camera.formats + .map { x in + + let dimensions = CMVideoFormatDescriptionGetDimensions(x.formatDescription) + let size = CGSize(width: Double(dimensions.width), + height: Double(dimensions.height)) + + return VideoFormatBundle(size: size, format: x) + } + .filter { x in + return acsFormatList.contains(x.size) + } + .unique() + .sorted(by: { s1, s2 in + return s1.size.width > s2.size.width + }) + } } diff --git a/raw-video/RawVideo/CaptureService.swift b/raw-video/RawVideo/CaptureService.swift index 1f0084a..bbff4a1 100644 --- a/raw-video/RawVideo/CaptureService.swift +++ b/raw-video/RawVideo/CaptureService.swift @@ -10,19 +10,19 @@ import AzureCommunicationCalling class CaptureService : NSObject { - let rawOutgoingVideoStream: RawOutgoingVideoStream + let stream: RawOutgoingVideoStream var delegate: ((RawVideoFrameBuffer) -> Void)? - init(rawOutgoingVideoStream: RawOutgoingVideoStream) + init(stream: RawOutgoingVideoStream) { - self.rawOutgoingVideoStream = rawOutgoingVideoStream + self.stream = stream } func SendRawVideoFrame(rawVideoFrameBuffer: RawVideoFrameBuffer) -> Void { if (CanSendRawVideoFrames()) { - rawOutgoingVideoStream.send(frame: rawVideoFrameBuffer) { error in + stream.send(frame: rawVideoFrameBuffer) { error in } @@ -35,8 +35,8 @@ class CaptureService : NSObject private func CanSendRawVideoFrames() -> Bool { - return rawOutgoingVideoStream != nil && - rawOutgoingVideoStream.format != nil && - rawOutgoingVideoStream.state == .started + return stream != nil && + stream.format != nil && + stream.state == .started } } diff --git a/raw-video/RawVideo/ContentView.swift b/raw-video/RawVideo/ContentView.swift index 9f0ef26..3ff63a4 100644 --- a/raw-video/RawVideo/ContentView.swift +++ b/raw-video/RawVideo/ContentView.swift @@ -14,8 +14,10 @@ struct ContentView : View // UI @State private var videoDeviceInfoItemList: [VideoDeviceInfoItem] = [] @State private var cameraItemList: [CameraItem] = [] - @State private var selectedVideoDeviceInfoIndex: Int = -1 - @State private var selectedCameraIndex: Int = -1 + @State private var videoFormatItemList: [VideoFormatItem] = [] + @State private var videoDeviceInfoListIndex: Int = -1 + @State private var cameraListIndex: Int = -1 + @State private var videoFormatListIndex: Int = -1 @State private var outgoingVideoStreamType: VideoStreamType = VideoStreamType.virtualOutgoing @State private var incomingVideoStreamType: VideoStreamType = VideoStreamType.rawIncoming @FocusState private var isFocused: Bool @@ -23,6 +25,7 @@ struct ContentView : View // App @State private var videoDeviceInfoList: [VideoDeviceInfo] = [] @State private var cameraList: [AVCaptureDevice] = [] + @State private var videoFormatList: [VideoFormatBundle] = [] @State private var callClient: CallClient? @State private var callAgent: CallAgent? @State private var call: Call? @@ -34,8 +37,9 @@ struct ContentView : View @State private var rawIncomingVideoStreamObserver: RawIncomingVideoStreamObserver? @State private var callObserver: CallObserver? @State private var remoteParticipantObserver: RemoteParticipantObserver? - @State private var screenCaptureService: ScreenCaptureService? @State private var cameraCaptureService: CameraCaptureService? + @State private var screenCaptureService: ScreenCaptureService? + @State private var videoFrameGeneratorService: VideoFrameGeneratorService? @State private var incomingVideoStream: IncomingVideoStream? @State private var remoteVideoStream: RemoteVideoStream? @State private var rawIncomingVideoStream: RawIncomingVideoStream? @@ -62,18 +66,24 @@ struct ContentView : View @State private var alertMessage: String = "" @State private var showAlert: Bool = false - struct CameraItem : Hashable + struct VideoDeviceInfoItem : Hashable { var id: Int var name: String } - struct VideoDeviceInfoItem : Hashable + struct CameraItem : Hashable { var id: Int var name: String } + struct VideoFormatItem : Hashable + { + var id: Int + var resolution: String + } + enum OutgoingVideoStreamTypeItem : String, CaseIterable { case localOutgoing @@ -84,12 +94,12 @@ struct ContentView : View { switch self { - case .localOutgoing: - return VideoStreamType.localOutgoing - case .virtualOutgoing: - return VideoStreamType.virtualOutgoing - case .screenShareOutgoing: - return VideoStreamType.screenShareOutgoing + case .localOutgoing: + return VideoStreamType.localOutgoing + case .virtualOutgoing: + return VideoStreamType.virtualOutgoing + case .screenShareOutgoing: + return VideoStreamType.screenShareOutgoing } } } @@ -125,18 +135,18 @@ struct ContentView : View { VStack { TextEditor(text: $token) - .frame(width: 250, height: 30) - .padding(10) - .overlay(RoundedRectangle(cornerRadius: 5) - .stroke(Color.black, lineWidth: 2)) - .focused($isFocused) - .onChange(of: token) { _ in - if token.last?.isNewline == .some(true) - { - token.removeLast() - isFocused = false + .frame(width: 250, height: 30) + .padding(10) + .overlay(RoundedRectangle(cornerRadius: 5) + .stroke(Color.black, lineWidth: 2)) + .focused($isFocused) + .onChange(of: token) { _ in + if token.last?.isNewline == .some(true) + { + token.removeLast() + isFocused = false + } } - } Button(action: { Task { await GetPermissions() @@ -159,18 +169,18 @@ struct ContentView : View if !callInProgress { TextEditor(text: $meetingLink) - .frame(width: 250, height: 30) - .padding(10) - .overlay(RoundedRectangle(cornerRadius: 5) - .stroke(Color.black, lineWidth: 2)) - .focused($isFocused) - .onChange(of: meetingLink) { _ in - if meetingLink.last?.isNewline == .some(true) - { - meetingLink.removeLast() - isFocused = false + .frame(width: 250, height: 30) + .padding(10) + .overlay(RoundedRectangle(cornerRadius: 5) + .stroke(Color.black, lineWidth: 2)) + .focused($isFocused) + .onChange(of: meetingLink) { _ in + if meetingLink.last?.isNewline == .some(true) + { + meetingLink.removeLast() + isFocused = false + } } - } Picker("", selection: $incomingVideoStreamType) { ForEach (IncomingVideoStreamTypeItem.allCases, id: \.self) { videoStreamType in Text(videoStreamType.rawValue).tag(videoStreamType.ToVideoStreamType()) @@ -193,7 +203,7 @@ struct ContentView : View .stroke(Color.black, lineWidth: 2)) if (outgoingVideoStreamType == VideoStreamType.localOutgoing) { - Picker("", selection: $selectedVideoDeviceInfoIndex) { + Picker("", selection: $videoDeviceInfoListIndex) { ForEach (videoDeviceInfoItemList, id: \.self) { videoDeviceInfoItem in Text(videoDeviceInfoItem.name).tag(videoDeviceInfoItem.id) } @@ -206,11 +216,25 @@ struct ContentView : View } if (outgoingVideoStreamType == VideoStreamType.virtualOutgoing) { - Picker("", selection: $selectedCameraIndex) { + Picker("", selection: $cameraListIndex) { ForEach (cameraItemList, id: \.self) { cameraItem in Text(cameraItem.name).tag(cameraItem.id) } } + .onChange(of: cameraListIndex) { _ in + didSelectedVideoFormat() + } + .accentColor(.black) + .frame(width: 250, height: 30) + .padding(10) + .overlay(RoundedRectangle(cornerRadius: 5) + .stroke(Color.black, lineWidth: 2)) + + Picker("", selection: $videoFormatListIndex) { + ForEach (videoFormatItemList, id: \.self) { videoFormatItem in + Text(videoFormatItem.resolution).tag(videoFormatItem.id) + } + } .accentColor(.black) .frame(width: 250, height: 30) .padding(10) @@ -220,51 +244,43 @@ struct ContentView : View } else { - ZStack(alignment: .topLeading) { - VStack { - if (outgoingVideoStream != nil) + VStack { + if (outgoingVideoStream != nil) + { + if (outgoingVideoStreamType != VideoStreamType.localOutgoing) { - if (outgoingVideoStreamType != VideoStreamType.localOutgoing) - { - RawVideoFrameView(cvPixelBuffer: $outgoingPixelBuffer) - .overlay(RoundedRectangle(cornerRadius: 5) - .stroke(Color.black, lineWidth: 2)) - .background(Color.black) - } - else - { - VideoStreamView(view: $outgoingVideoStreamRendererView) - .overlay(RoundedRectangle(cornerRadius: 5) - .stroke(Color.black, lineWidth: 2)) - .background(Color.black) - } + RawVideoFrameView(cvPixelBuffer: $outgoingPixelBuffer) + .background(Color.black) + } + else + { + VideoStreamView(view: $outgoingVideoStreamRendererView) + .background(Color.black) } } - .frame(width: 120, height: 67.5) - .zIndex(1) - .offset(x: 5, y: 5) + } + .frame(width: 320, height: 180) + .overlay(RoundedRectangle(cornerRadius: 5) + .stroke(Color.black, lineWidth: 2)) - VStack { - if (incomingVideoStream != nil) + VStack { + if (incomingVideoStream != nil) + { + if (incomingVideoStreamType != VideoStreamType.remoteIncoming) { - if (incomingVideoStreamType != VideoStreamType.remoteIncoming) - { - RawVideoFrameView(cvPixelBuffer: $incomingPixelBuffer) - .background(Color.black) - } - else - { - VideoStreamView(view: $incomingVideoStreamRendererView) - .background(Color.black) - } + RawVideoFrameView(cvPixelBuffer: $incomingPixelBuffer) + .background(Color.black) + } + else + { + VideoStreamView(view: $incomingVideoStreamRendererView) + .background(Color.black) } } - .frame(width: 320, height: 180) - .zIndex(0) - .overlay(RoundedRectangle(cornerRadius: 5) - .stroke(Color.black, lineWidth: 2)) } - .frame(width: geometryReader.size.width - 30, height: 180) + .frame(width: 320, height: 180) + .overlay(RoundedRectangle(cornerRadius: 5) + .stroke(Color.black, lineWidth: 2)) } HStack { Button(action: { @@ -347,13 +363,14 @@ struct ContentView : View await CreateCallAgent() - guard let deviceManager = deviceManager else { + guard let deviceManager = deviceManager else + { return } videoDeviceInfoList = deviceManager.cameras videoDeviceInfoItemList = [VideoDeviceInfoItem](); - selectedVideoDeviceInfoIndex = videoDeviceInfoList.count > 0 ? 0 : -1; + videoDeviceInfoListIndex = videoDeviceInfoList.count > 0 ? 0 : -1; for i in 0 ..< videoDeviceInfoList.count { @@ -363,7 +380,7 @@ struct ContentView : View cameraList = CameraCaptureService.GetCameraList() cameraItemList = [CameraItem](); - selectedCameraIndex = cameraList.count > 0 ? 0 : -1; + cameraListIndex = cameraList.count > 0 ? 0 : -1; for i in 0 ..< cameraList.count { @@ -371,6 +388,8 @@ struct ContentView : View cameraItemList.append(cameraItem) } + didSelectedVideoFormat() + showCallSettings = true let defaults = UserDefaults.standard @@ -418,7 +437,8 @@ struct ContentView : View let callAgentOptions = CallAgentOptions() callAgentOptions.displayName = "iOS Quickstart User" - callAgent = try await callClient?.createCallAgent(userCredential: credential, options: callAgentOptions) + callAgent = try await callClient?.createCallAgent(userCredential: credential, + options: callAgentOptions) deviceManager = try await callClient?.getDeviceManager() @@ -480,7 +500,8 @@ struct ContentView : View loading = false - guard let call = call else { + guard let call = call else + { return } @@ -505,7 +526,7 @@ struct ContentView : View switch (outgoingVideoStreamType) { case .localOutgoing: - let videoDeviceInfo = videoDeviceInfoList[selectedVideoDeviceInfoIndex] + let videoDeviceInfo = videoDeviceInfoList[videoDeviceInfoListIndex] localVideoStream = LocalVideoStream(camera: videoDeviceInfo) localVideoStream!.delegate = localVideoStreamObserver outgoingVideoStream = localVideoStream @@ -556,19 +577,19 @@ struct ContentView : View switch (outgoingVideoStreamType) { case .virtualOutgoing: - format.resolution = VideoStreamResolution.vga - w = Double(format.width) - h = Double(format.height) + let size = videoFormatList[videoFormatListIndex].size + w = size.width + h = size.height break; case .screenShareOutgoing: GetDisplaySize() - format.width = Int32(w) - format.height = Int32(h) break; default: break; } + format.width = Int32(w) + format.height = Int32(h) format.stride1 = Int32(w) format.stride2 = Int32(w) @@ -666,7 +687,8 @@ struct ContentView : View break case .rawIncoming: - guard let rawIncomingVideoStreamG = stream as? RawIncomingVideoStream else { + guard let rawIncomingVideoStreamG = stream as? RawIncomingVideoStream else + { return } @@ -778,21 +800,41 @@ struct ContentView : View if cameraCaptureService == nil { cameraCaptureService = CameraCaptureService( - rawOutgoingVideoStream: virtualOutgoingVideoStream!) - cameraCaptureService?.Start(camera: cameraList[selectedCameraIndex]) + stream: virtualOutgoingVideoStream!, + camera: cameraList[cameraListIndex], + format: videoFormatList[videoFormatListIndex].format) + cameraCaptureService?.Start() cameraCaptureService?.delegate = OnRawVideoFrameCaptured } + + /*if videoFrameGeneratorService == nil + { + videoFrameGeneratorService = VideoFrameGeneratorService( + stream: virtualOutgoingVideoStream!) + videoFrameGeneratorService?.Start() + videoFrameGeneratorService?.delegate = OnRawVideoFrameCaptured + }*/ } private func StopCameraCaptureService() -> Void { - guard let cameraCaptureService = cameraCaptureService else { + guard let cameraCaptureService = cameraCaptureService else + { return } cameraCaptureService.delegate = nil cameraCaptureService.Stop() self.cameraCaptureService = nil + + /*guard let videoFrameGeneratorService = videoFrameGeneratorService else + { + return + } + + videoFrameGeneratorService.delegate = nil + videoFrameGeneratorService.Stop() + self.videoFrameGeneratorService = nil*/ } private func StartScreenCaptureService() -> Void @@ -800,7 +842,7 @@ struct ContentView : View if screenCaptureService == nil { screenCaptureService = ScreenCaptureService( - rawOutgoingVideoStream: screenShareOutgoingVideoStream!) + stream: screenShareOutgoingVideoStream!) screenCaptureService?.Start() screenCaptureService?.delegate = OnRawVideoFrameCaptured } @@ -808,7 +850,8 @@ struct ContentView : View private func StopScreenCaptureService() -> Void { - guard let screenCaptureService = screenCaptureService else { + guard let screenCaptureService = screenCaptureService else + { return } @@ -919,10 +962,10 @@ struct ContentView : View switch outgoingVideoStreamType { case .localOutgoing: - isValid = selectedVideoDeviceInfoIndex != -1 + isValid = videoDeviceInfoListIndex != -1 break case .virtualOutgoing: - isValid = selectedCameraIndex != -1 + isValid = cameraListIndex != -1 break default: break @@ -930,6 +973,28 @@ struct ContentView : View return isValid; } + + private func didSelectedVideoFormat() -> Void + { + if cameraListIndex == -1 + { + return + } + + videoFormatList = CameraCaptureService.GetSuportedVideoFormats( + camera: cameraList[cameraListIndex]) + + videoFormatItemList = [VideoFormatItem](); + videoFormatListIndex = videoFormatList.count > 0 ? 0 : -1; + + for i in 0 ..< videoFormatList.count + { + let size = videoFormatList[i].size + let resolution = "\(Int(size.width))x\(Int(size.height))" + let videoFormatItem = VideoFormatItem(id: i, resolution: resolution) + videoFormatItemList.append(videoFormatItem) + } + } } class LocalVideoStreamObserver: NSObject, LocalVideoStreamDelegate diff --git a/raw-video/RawVideo/ScreenCaptureService.swift b/raw-video/RawVideo/ScreenCaptureService.swift index 0405ccb..4e7dd96 100644 --- a/raw-video/RawVideo/ScreenCaptureService.swift +++ b/raw-video/RawVideo/ScreenCaptureService.swift @@ -34,16 +34,17 @@ class ScreenCaptureService : CaptureService return } - guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { + guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else + { return } - let format = rawOutgoingVideoStream.format + let format = stream.format if format != nil { - let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer) let width = CVPixelBufferGetWidth(pixelBuffer) let height = CVPixelBufferGetHeight(pixelBuffer) + let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer) let rawVideoFrameBuffer = RawVideoFrameBuffer() rawVideoFrameBuffer.buffer = pixelBuffer diff --git a/raw-video/RawVideo/VideoFrameGeneratorService.swift b/raw-video/RawVideo/VideoFrameGeneratorService.swift new file mode 100644 index 0000000..c7a415d --- /dev/null +++ b/raw-video/RawVideo/VideoFrameGeneratorService.swift @@ -0,0 +1,143 @@ +// +// VideoFrameGeneratorService.swift +// RawVideo +// +// Created by Yassir Bisteni Aldana on 11/03/24. +// + +import Foundation +import AzureCommunicationCalling + +class VideoFrameGeneratorService : CaptureService +{ + private var frameIteratorThread: Thread? + private var stopFrameIterator: Bool + let w: Double + let h: Double + let framerate: Float + + override init(stream: RawOutgoingVideoStream) + { + let format = stream.format + self.w = Double(format.width) + self.h = Double(format.height) + self.framerate = format.framesPerSecond + self.stopFrameIterator = false + + super.init(stream: stream) + } + + func Start() -> Void + { + stopFrameIterator = false + frameIteratorThread = Thread(target: self, + selector: #selector(FrameIterator), + object: "com.azure.communication.calling.ios.FrameIterator") + frameIteratorThread?.start() + } + + func Stop() -> Void + { + if let thread = frameIteratorThread + { + stopFrameIterator = true + thread.cancel() + frameIteratorThread = nil + } + } + + @objc func FrameIterator() -> Void + { + while (!stopFrameIterator) + { + if let cvPixelBuffer = GenerateBufferNV12() + { + let format = stream.format + if format != nil + { + let rawVideoFrameBuffer = RawVideoFrameBuffer() + rawVideoFrameBuffer.buffer = cvPixelBuffer + rawVideoFrameBuffer.streamFormat = format + + SendRawVideoFrame(rawVideoFrameBuffer: rawVideoFrameBuffer) + } + } + + let rate = 0.1 / framerate + let second: Float = 1000000 + usleep(useconds_t(rate * second)) + } + } + + func GenerateBufferNV12() -> CVPixelBuffer? + { + var cvPixelBufferRef: CVPixelBuffer? + guard CVPixelBufferCreate(kCFAllocatorDefault, + Int(w), + Int(h), + kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, + nil, + &cvPixelBufferRef) == kCVReturnSuccess else + { + return nil + } + + guard let cvPixelBuffer = cvPixelBufferRef else + { + return nil + } + + guard CVPixelBufferLockBaseAddress(cvPixelBuffer, .readOnly) == kCVReturnSuccess else + { + return nil + } + + guard let yBufferArray = CVPixelBufferGetBaseAddressOfPlane(cvPixelBuffer, 0) else + { + return nil + } + + guard let uvBufferArray = CVPixelBufferGetBaseAddressOfPlane(cvPixelBuffer, 1) else + { + return nil + } + + var halfX: Double = 0, halfY: Double = 0 + var rVal: Double = 0, gVal: Double = 0, bVal: Double = 0 + var yVal: Double, uVal: Double = 0, vVal: Double = 0 + + for y in 0 ..< Int(h) + { + halfY = Double(y) / 2 + for x in 0 ..< Int(w) + { + halfX = Double(x) / 2 + + let randomVal = Double.random(in: 1 ..< 255) + rVal = randomVal + gVal = randomVal + bVal = randomVal + + yVal = 0.257 * rVal + 0.504 * gVal + 0.098 * bVal + 16; + uVal = -0.148 * rVal - 0.291 * gVal + 0.439 * bVal + 128; + vVal = 0.439 * rVal - 0.368 * gVal - 0.071 * bVal + 128; + + yBufferArray.storeBytes(of: Clip(val: yVal), toByteOffset: Int((y * Int(w)) + x), as: UInt8.self) + uvBufferArray.storeBytes(of: Clip(val: uVal), toByteOffset: Int((halfY * w) + (halfX + 0)), as: UInt8.self) + uvBufferArray.storeBytes(of: Clip(val: vVal), toByteOffset: Int((halfY * w) + (halfX + 1)), as: UInt8.self) + } + } + + guard CVPixelBufferUnlockBaseAddress(cvPixelBuffer, .readOnly) == kCVReturnSuccess else + { + return nil + } + + return cvPixelBuffer + } + + func Clip(val: Double) -> UInt8 + { + return UInt8(val > 255 ? 255 : val < 0 ? 0 : val) + } +} diff --git a/raw-video/RawVideo/VideoStreamView.swift b/raw-video/RawVideo/VideoStreamView.swift index bcfa20a..c8480a6 100644 --- a/raw-video/RawVideo/VideoStreamView.swift +++ b/raw-video/RawVideo/VideoStreamView.swift @@ -5,9 +5,9 @@ // Created by Yassir Amadh Bisteni Aldana on 20/04/23. // -import AzureCommunicationCalling import Foundation import SwiftUI +import AzureCommunicationCalling struct VideoStreamView : UIViewRepresentable {