diff options
author | leonid lokhmatov, Luxoft <zaqqqqqqqq@gmail.com> | 2021-02-16 15:19:37 +0200 |
---|---|---|
committer | leonid lokhmatov, Luxoft <zaqqqqqqqq@gmail.com> | 2021-02-16 15:19:37 +0200 |
commit | c2e75cdd88af8d195db3c9dcddbd7d5545910648 (patch) | |
tree | 28c5baea21761507929088dcf0b267440725de11 | |
parent | 298d03171fe0b8ddd59672aa610cf699f8db5454 (diff) | |
download | sdl_ios-c2e75cdd88af8d195db3c9dcddbd7d5545910648.tar.gz |
[0296] 'upd video stream cap/r3': handle old head unit in video lifecycle mgr
-rw-r--r-- | SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m b/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m index e80b828bc..2857d88e5 100644 --- a/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m +++ b/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m @@ -20,6 +20,8 @@ #import "SDLDisplayCapabilities.h" #import "SDLFocusableItemLocator.h" #import "SDLGenericResponse.h" +#import "SDLGetSystemCapability.h" +#import "SDLGetSystemCapabilityResponse.h" #import "SDLGlobals.h" #import "SDLH264VideoEncoder.h" #import "SDLHMILevel.h" @@ -423,14 +425,16 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N - (void)didEnterStateVideoStreamStarting { SDLLogD(@"Video stream starting"); - if (self.shouldAutoResume && (self.videoStreamingCapabilityUpdated != nil)) { + const BOOL applyCapabilities = self.shouldAutoResume && (self.videoStreamingCapabilityUpdated != nil); + if (applyCapabilities) { //apply previously received video capabilities [self sdl_applyVideoCapabilityWhileStarting:self.videoStreamingCapabilityUpdated]; - } else { - [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeVideoStreaming withObserver:self selector:@selector(sdl_videoStreamingCapabilityDidUpdate:)]; } self.shouldAutoResume = NO; self.videoStreamingCapabilityUpdated = nil; + if (!applyCapabilities) { + [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeVideoStreaming withObserver:self selector:@selector(sdl_videoStreamingCapabilityDidUpdate:)]; + } } - (void)didEnterStateVideoStreamReady { @@ -713,16 +717,30 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N SDLLogD(@"Video capabilities notification received (%@): %@", self.videoStreamStateMachine.currentState, videoCapability); } + if (videoCapability) { + [self sdl_useVideoCapability:videoCapability]; + } else { + typeof(self) weakSelf = self; + [self sdl_requestVideoCapabilities:^(SDLVideoStreamingCapability * _Nullable capability) { + SDLLogD(@"Received video capability response"); + SDLLogV(@"Capability: %@", capability); + [weakSelf sdl_useVideoCapability:capability]; + }]; + } +} + +#pragma mark - Video capability logic + +- (void)sdl_useVideoCapability:(SDLVideoStreamingCapability *)videoCapability { if ([self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateStarting]) { [self sdl_applyVideoCapabilityWhileStarting:videoCapability]; - } - else if ([self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateReady]) { + } else if ([self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateReady]) { [self sdl_applyVideoCapabilityWhenStreaming:videoCapability]; + } else { + SDLLogD(@"Received video capabilities in wrong state: %@; ignore it", self.videoStreamStateMachine.currentState); } } -#pragma mark - Video capability logic - - (void)sdl_applyVideoCapabilityWhileStarting:(nullable SDLVideoStreamingCapability *)videoCapabilityUpdated { SDLVideoStreamingCapability *videoCapability = (nil == videoCapabilityUpdated) ? [self sdl_defaultVideoCapability] : videoCapabilityUpdated; NSArray<SDLVideoStreamingCapability *> *capabilityMatches = [self matchVideoCapability:videoCapability]; @@ -987,6 +1005,27 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N } } +- (void)sdl_requestVideoCapabilities:(SDLVideoCapabilityResponseHandler)responseHandler { + SDLLogD(@"Requesting video capabilities"); + SDLGetSystemCapability *getVideoCapabilityRequest = [[SDLGetSystemCapability alloc] initWithType:SDLSystemCapabilityTypeVideoStreaming]; + + typeof(self) weakSelf = self; + [self.connectionManager sendConnectionManagerRequest:getVideoCapabilityRequest withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { + if (!response.success || [response isMemberOfClass:SDLGenericResponse.class]) { + SDLLogW(@"Video capabilities response failed: %@", error); + responseHandler(nil); + BLOCK_RETURN; + } + + SDLVideoStreamingCapability *videoCapability = ((SDLGetSystemCapabilityResponse *)response).systemCapability.videoStreamingCapability; + SDLLogD(@"Video capabilities response received: %@", videoCapability); + + weakSelf.videoScaleManager.scale = (videoCapability != nil && videoCapability.scale != nil) ? videoCapability.scale.floatValue : (float)0.0; + + responseHandler(videoCapability); + }]; +} + /** Pull the current format / resolution out of our preferred resolutions and craft a start video service payload out of it, then send a start service. If the format isn't one that we support, we're going to try the next format. */ |