diff --git a/submodules/TelegramCore/Sources/CallSessionManager.swift b/submodules/TelegramCore/Sources/CallSessionManager.swift index abeca9b75c..2f070593a8 100644 --- a/submodules/TelegramCore/Sources/CallSessionManager.swift +++ b/submodules/TelegramCore/Sources/CallSessionManager.swift @@ -308,7 +308,7 @@ private final class CallSessionContext { } private func selectVersionOnAccept(localVersions: [CallSessionManagerImplementationVersion], remoteVersions: [String]) -> [String]? { - let filteredVersions = localVersions.map(\.version).filter(remoteVersions.contains) + let filteredVersions = localVersions.map({ $0.version }).filter(remoteVersions.contains) if filteredVersions.isEmpty { return nil } else { @@ -626,7 +626,7 @@ private final class CallSessionManagerContext { if let context = self.contexts[internalId] { switch context.state { case let .ringing(id, accessHash, gAHash, b, remoteVersions): - let acceptVersions = self.versions.map(\.version) + let acceptVersions = self.versions.map({ $0.version }) context.state = .accepting(id: id, accessHash: accessHash, gAHash: gAHash, b: b, disposable: (acceptCallSession(postbox: self.postbox, network: self.network, stableId: id, accessHash: accessHash, b: b, maxLayer: self.maxLayer, versions: acceptVersions) |> deliverOn(self.queue)).start(next: { [weak self] result in if let strongSelf = self, let context = strongSelf.contexts[internalId] { if case .accepting = context.state { diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoip/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoip/OngoingCallThreadLocalContext.h index 4f8132b378..67cae45a52 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoip/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoip/OngoingCallThreadLocalContext.h @@ -87,7 +87,7 @@ typedef NS_ENUM(int32_t, OngoingCallDataSavingWebrtc) { @property (nonatomic, readonly) OngoingCallVideoOrientationWebrtc orientation; -- (void)setOnFirstFrameReceived:(void (^ _Nullable)())onFirstFrameReceived; +- (void)setOnFirstFrameReceived:(void (^ _Nullable)(float))onFirstFrameReceived; - (void)setOnOrientationUpdated:(void (^ _Nullable)(OngoingCallVideoOrientationWebrtc))onOrientationUpdated; - (void)setOnIsMirroredUpdated:(void (^ _Nullable)(bool))onIsMirroredUpdated; @@ -111,7 +111,7 @@ typedef NS_ENUM(int32_t, OngoingCallDataSavingWebrtc) { + (int32_t)maxLayer; + (NSArray * _Nonnull)versionsWithIncludeReference:(bool)includeReference; -@property (nonatomic, copy) void (^ _Nullable stateChanged)(OngoingCallStateWebrtc, OngoingCallVideoStateWebrtc, OngoingCallRemoteVideoStateWebrtc); +@property (nonatomic, copy) void (^ _Nullable stateChanged)(OngoingCallStateWebrtc, OngoingCallVideoStateWebrtc, OngoingCallRemoteVideoStateWebrtc, float); @property (nonatomic, copy) void (^ _Nullable signalBarsChanged)(int32_t); - (instancetype _Nonnull)initWithVersion:(NSString * _Nonnull)version queue:(id _Nonnull)queue proxy:(VoipProxyServerWebrtc * _Nullable)proxy networkType:(OngoingCallNetworkTypeWebrtc)networkType dataSaving:(OngoingCallDataSavingWebrtc)dataSaving derivedState:(NSData * _Nonnull)derivedState key:(NSData * _Nonnull)key isOutgoing:(bool)isOutgoing primaryConnection:(OngoingCallConnectionDescriptionWebrtc * _Nonnull)primaryConnection alternativeConnections:(NSArray * _Nonnull)alternativeConnections maxLayer:(int32_t)maxLayer allowP2P:(BOOL)allowP2P logPath:(NSString * _Nonnull)logPath sendSignalingData:(void (^ _Nonnull)(NSData * _Nonnull))sendSignalingData videoCapturer:(OngoingCallThreadLocalContextVideoCapturer * _Nullable)videoCapturer preferredAspectRatio:(float)preferredAspectRatio enableHighBitrateVideoCalls:(bool)enableHighBitrateVideoCalls; diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 38418c8d44..550a49d3d5 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -15,6 +15,8 @@ #import "platform/darwin/VideoMetalViewMac.h" #define GLVideoView VideoMetalView #define UIViewContentModeScaleAspectFill kCAGravityResizeAspectFill +#define UIViewContentModeScaleAspect kCAGravityResizeAspect + #else #import "platform/darwin/VideoMetalView.h" #import "platform/darwin/GLVideoView.h" @@ -219,6 +221,9 @@ NSData *_lastDerivedState; void (^_sendSignalingData)(NSData *); + + float _remotePreferredAspectRatio; + } - (void)controllerStateChanged:(tgcalls::State)state videoState:(OngoingCallVideoStateWebrtc)videoState; @@ -313,6 +318,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; _callRingTimeout = 90.0; _callConnectTimeout = 30.0; _callPacketTimeout = 10.0; + _remotePreferredAspectRatio = 0; _networkType = networkType; _sendSignalingData = [sendSignalingData copy]; _videoCapturer = videoCapturer; @@ -452,12 +458,23 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; if (strongSelf->_remoteVideoState != remoteVideoState) { strongSelf->_remoteVideoState = remoteVideoState; if (strongSelf->_stateChanged) { - strongSelf->_stateChanged(strongSelf->_state, strongSelf->_videoState, strongSelf->_remoteVideoState); + strongSelf->_stateChanged(strongSelf->_state, strongSelf->_videoState, strongSelf->_remoteVideoState, strongSelf->_remotePreferredAspectRatio); } } } }]; }, + .remotePrefferedAspectRatioUpdated = [weakSelf, queue](float value) { + [queue dispatch:^{ + __strong OngoingCallThreadLocalContextWebrtc *strongSelf = weakSelf; + if (strongSelf) { + strongSelf->_remotePreferredAspectRatio = value; + if (strongSelf->_stateChanged) { + strongSelf->_stateChanged(strongSelf->_state, strongSelf->_videoState, strongSelf->_remoteVideoState, strongSelf->_remotePreferredAspectRatio); + } + } + }]; + }, .signalingDataEmitted = [weakSelf, queue](const std::vector &data) { NSData *mappedData = [[NSData alloc] initWithBytes:data.data() length:data.size()]; [queue dispatch:^{ @@ -565,7 +582,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; _videoState = videoState; if (_stateChanged) { - _stateChanged(_state, _videoState, _remoteVideoState); + _stateChanged(_state, _videoState, _remoteVideoState, _remotePreferredAspectRatio); } } } @@ -586,6 +603,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; } } + - (void)addSignalingData:(NSData *)data { if (_tgVoip) { std::vector mappedData; @@ -616,7 +634,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; dispatch_async(dispatch_get_main_queue(), ^{ if ([VideoMetalView isSupported]) { VideoMetalView *remoteRenderer = [[VideoMetalView alloc] initWithFrame:CGRectZero]; - remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; + remoteRenderer.videoContentMode = UIViewContentModeScaleAspect; std::shared_ptr> sink = [remoteRenderer getSink]; __strong OngoingCallThreadLocalContextWebrtc *strongSelf = weakSelf;