-
Notifications
You must be signed in to change notification settings - Fork 105
/
SDLStreamingMediaManager.h
186 lines (148 loc) · 6.98 KB
/
SDLStreamingMediaManager.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
//
// SDLStreamingDataManager.h
// SmartDeviceLink-iOS
//
// Created by Joel Fischer on 8/11/15.
// Copyright (c) 2015 smartdevicelink. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <VideoToolbox/VideoToolbox.h>
#import "SDLStreamingAudioManagerType.h"
#import "SDLStreamingMediaManagerConstants.h"
@class SDLAudioStreamManager;
@class SDLConfiguration;
@class SDLProtocol;
@class SDLSecondaryTransportManager;
@class SDLSystemCapabilityManager;
@class SDLTouchManager;
@class SDLVideoStreamingFormat;
@protocol SDLFocusableItemLocatorType;
@protocol SDLConnectionManagerType;
NS_ASSUME_NONNULL_BEGIN
/// Manager to help control streaming (video and audio) media services.
@interface SDLStreamingMediaManager : NSObject <SDLStreamingAudioManagerType>
/**
* Touch Manager responsible for providing touch event notifications.
*/
@property (nonatomic, strong, readonly) SDLTouchManager *touchManager;
/**
* Audio Manager responsible for managing streaming audio.
*/
@property (nonatomic, strong, readonly) SDLAudioStreamManager *audioManager;
/**
This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on `SDLStreamingMediaConfiguration` `rootViewController`. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.
*/
@property (nonatomic, strong, nullable) UIViewController *rootViewController;
/**
A haptic interface that can be updated to reparse views within the window you've provided. Send a `SDLDidUpdateProjectionView` notification or call the `updateInterfaceLayout` method to reparse. The "output" of this haptic interface occurs in the `touchManager` property where it will call the delegate.
*/
@property (nonatomic, strong, readonly, nullable) id<SDLFocusableItemLocatorType> focusableItemManager;
/**
* Whether or not video streaming is supported
*
* @see SDLRegisterAppInterface SDLDisplayCapabilities
*/
@property (assign, nonatomic, readonly, getter=isStreamingSupported) BOOL streamingSupported;
/**
* Whether or not the video session is connected.
*/
@property (assign, nonatomic, readonly, getter=isVideoConnected) BOOL videoConnected;
/**
* Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.
*/
@property (assign, nonatomic, readonly, getter=isVideoEncrypted) BOOL videoEncrypted;
/**
* Whether or not the audio session is connected.
*/
@property (assign, nonatomic, readonly, getter=isAudioConnected) BOOL audioConnected;
/**
* Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.
*/
@property (assign, nonatomic, readonly, getter=isAudioEncrypted) BOOL audioEncrypted;
/**
* Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.
*/
@property (assign, nonatomic, readonly, getter=isVideoStreamingPaused) BOOL videoStreamingPaused;
/**
* The current screen resolution of the connected display in pixels.
*/
@property (assign, nonatomic, readonly) CGSize screenSize;
/**
This is the agreed upon format of video encoder that is in use, or nil if not currently connected.
*/
@property (strong, nonatomic, readonly, nullable) SDLVideoStreamingFormat *videoFormat;
/**
A list of all supported video formats by this manager
*/
@property (strong, nonatomic, readonly) NSArray<SDLVideoStreamingFormat *> *supportedFormats;
/**
* The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.
*
* @warning This will only return a valid pixel buffer pool after the encoder has been initialized (when the video session has started).
* @discussion Clients may call this once and retain the resulting pool, this call is cheap enough that it's OK to call it once per frame.
*/
@property (assign, nonatomic, readonly, nullable) CVPixelBufferPoolRef pixelBufferPool;
/**
* The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.
*
* DEFAULT: SDLStreamingEncryptionFlagAuthenticateAndEncrypt
*/
@property (assign, nonatomic) SDLStreamingEncryptionFlag requestedEncryptionType;
/**
When YES, the StreamingMediaManager will send a black screen with "Video Backgrounded String". Defaults to YES.
*/
@property (assign, nonatomic) BOOL showVideoBackgroundDisplay;
#pragma mark - Lifecycle
/// Initializer unavailable
- (instancetype)init NS_UNAVAILABLE;
/// Create a new streaming media manager for navigation and projection apps with a specified configuration.
/// @param connectionManager The pass-through for RPCs
/// @param configuration This session's configuration
/// @param systemCapabilityManager The system capability manager object for reading window capabilities
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLConfiguration *)configuration systemCapabilityManager:(nullable SDLSystemCapabilityManager *)systemCapabilityManager NS_DESIGNATED_INITIALIZER;
/**
* Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on `SDLManager`.
*/
- (void)startWithProtocol:(SDLProtocol *)protocol;
/**
* Stop the manager. This method is used internally.
*/
- (void)stop;
/**
* Stop the audio feature of the manager. This method is used internally.
*/
- (void)stopAudio;
/**
* Stop the video feature of the manager. This method is used internally.
*/
- (void)stopVideo;
#pragma mark - Data Transfer
/**
* This method receives raw image data and will run iOS8+'s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.
*
* @param imageBuffer A CVImageBufferRef to be encoded by Video Toolbox
*
* @return Whether or not the data was successfully encoded and sent.
*/
- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer;
/**
* This method receives raw image data and will run iOS8+'s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.
*
* @param imageBuffer A CVImageBufferRef to be encoded by Video Toolbox
* @param presentationTimestamp A presentation timestamp for the frame, or kCMTimeInvalid if timestamp is unknown. If it's valid, it must be greater than the previous one.
*
* @return Whether or not the data was successfully encoded and sent.
*/
- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer presentationTimestamp:(CMTime)presentationTimestamp;
/**
* This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.
*
* NOTE: See the `.audioManager` (SDLAudioStreamManager) `pushWithData:` method for a more modern API.
*
* @param audioData The data in PCM audio format, to be played
*
* @return Whether or not the data was successfully sent.
*/
- (BOOL)sendAudioData:(NSData *)audioData;
@end
NS_ASSUME_NONNULL_END