summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleonid lokhmatov, Luxoft <zaqqqqqqqq@gmail.com>2021-02-16 15:19:37 +0200
committerleonid lokhmatov, Luxoft <zaqqqqqqqq@gmail.com>2021-02-16 15:19:37 +0200
commitc2e75cdd88af8d195db3c9dcddbd7d5545910648 (patch)
tree28c5baea21761507929088dcf0b267440725de11
parent298d03171fe0b8ddd59672aa610cf699f8db5454 (diff)
downloadsdl_ios-c2e75cdd88af8d195db3c9dcddbd7d5545910648.tar.gz
[0296] 'upd video stream cap/r3': handle old head unit in video lifecycle mgr
-rw-r--r--SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m53
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.
*/