summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2019-03-27 18:02:20 -0400
committerJoey Grover <joeygrover@gmail.com>2019-03-27 18:02:20 -0400
commit204469fb0086d61b0fd12a72f22da05e5c4ace07 (patch)
treee4d6db667a5b5dc689656f32c62fa46c5d9b6f2e
parentcef1cbb1e8a36d172bda93866c2160c64b01b9de (diff)
downloadsdl_android-bugfix/fix_start_vid_service.tar.gz
Create new async flow for video streamingbugfix/fix_start_vid_service
-rw-r--r--android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamManagerTests.java2
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java5
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java75
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java24
-rw-r--r--base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java7
-rw-r--r--javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java6
6 files changed, 85 insertions, 34 deletions
diff --git a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamManagerTests.java b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamManagerTests.java
index e0febdb51..c60bbf6ae 100644
--- a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamManagerTests.java
+++ b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamManagerTests.java
@@ -125,7 +125,7 @@ public class VideoStreamManagerTests extends AndroidTestCase2 {
videoStreamManager.start(new CompletionListener() {
@Override
public void onComplete(boolean success) {
- assertNull(videoStreamManager.startVideoService(
+ assertNull(videoStreamManager.startStreaming(
new VideoStreamingParameters(), false));
}
});
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java
index 05651598b..5719f9341 100644
--- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java
@@ -616,6 +616,11 @@ public class SdlManager extends BaseSdlManager{
}
@Override
+ public IVideoStreamListener startVideoStreamEncoder() {
+ return proxy.startVideoStreamEncoder();
+ }
+
+ @Override
public void stopVideoService() {
if(proxy.getIsConnected()){
proxy.endVideoStream();
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java
index 7af1db458..427928266 100644
--- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java
@@ -58,7 +58,8 @@ public class VideoStreamManager extends BaseVideoStreamManager {
private StreamingStateMachine stateMachine;
private VideoStreamingParameters parameters;
private IVideoStreamListener streamListener;
- private boolean isTransportAvailable = false;
+ private boolean isTransportAvailable = false, videoServiceStarted = false;
+ private boolean queueStreaming = false;
// INTERNAL INTERFACES
@@ -66,13 +67,25 @@ public class VideoStreamManager extends BaseVideoStreamManager {
@Override
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
if(SessionType.NAV.equals(type)){
+ videoServiceStarted = true;
+ if(session != null && session.getAcceptedVideoParams() != null){
+ parameters = session.getAcceptedVideoParams();
+ }
stateMachine.transitionToState(StreamingStateMachine.READY);
+ //we are actually ready to start streaming
+ if(queueStreaming){
+ //If a streaming session was queued then it's time to start the enocder
+ startStreaming();
+ //Reset the queue
+ queueStreaming = false;
+ }
}
}
@Override
public void onServiceEnded(SdlSession session, SessionType type) {
if(SessionType.NAV.equals(type)){
+ videoServiceStarted = false;
stateMachine.transitionToState(StreamingStateMachine.NONE);
if(remoteDisplay!=null){
stopStreaming();
@@ -82,6 +95,7 @@ public class VideoStreamManager extends BaseVideoStreamManager {
@Override
public void onServiceError(SdlSession session, SessionType type, String reason) {
+ videoServiceStarted = false;
stateMachine.transitionToState(StreamingStateMachine.ERROR);
transitionToState(BaseSubManager.ERROR);
}
@@ -230,40 +244,38 @@ public class VideoStreamManager extends BaseVideoStreamManager {
}
/**
- * Opens a video service (service type 11) and subsequently provides an IVideoStreamListener
- * to the app to send video data. The supplied VideoStreamingParameters will be set as desired paramaters
- * that will be used to negotiate
- *
- * @param parameters Video streaming parameters including: codec which will be used for streaming (currently, only
+ * Starts video service, sets up encoder, haptic manager, and remote display. Begins streaming the remote display.
+ * @param parameters Video streaming parameters including: codec which will be used for streaming (currently, only
* VideoStreamingCodec.H264 is accepted), height and width of the video in pixels.
* @param encrypted Specify true if packets on this service have to be encrypted
- *
- * @return IVideoStreamListener interface if service is opened successfully and streaming is
- * started, null otherwise
+ * @return if the stream was kicked off
*/
- protected IVideoStreamListener startVideoService(VideoStreamingParameters parameters, boolean encrypted){
+ protected boolean startStreaming(VideoStreamingParameters parameters, boolean encrypted){
+ this.parameters = parameters;
if(hmiLevel != HMILevel.HMI_FULL){
Log.e(TAG, "Cannot start video service if HMILevel is not FULL.");
- return null;
+ return false;
}
- IVideoStreamListener listener = internalInterface.startVideoStream(encrypted, parameters);
- if(listener != null){
- stateMachine.transitionToState(StreamingStateMachine.STARTED);
- }else{
- stateMachine.transitionToState(StreamingStateMachine.ERROR);
+ if(videoServiceStarted){
+ startStreaming();
+ return true;
+ }else {
+ if (!queueStreaming) { //Make sure we haven't already queued streaming
+ queueStreaming = true;
+ this.internalInterface.startVideoService(parameters, encrypted);
+ return true;
+ }
}
- return listener;
+ return false;
+
}
/**
- * Starts video service, sets up encoder, haptic manager, and remote display. Begins streaming the remote display.
- * @param parameters Video streaming parameters including: codec which will be used for streaming (currently, only
- * VideoStreamingCodec.H264 is accepted), height and width of the video in pixels.
- * @param encrypted Specify true if packets on this service have to be encrypted
+ * Starts the actual data stream by telling the session to start the stream encoder then starts
+ * the virtual display encoder.
*/
- private void startStreaming(VideoStreamingParameters parameters, boolean encrypted){
- this.parameters = parameters;
- this.streamListener = startVideoService(parameters, encrypted);
+ private void startStreaming(){
+ VideoStreamManager.this.streamListener = internalInterface.startVideoStreamEncoder();
if(streamListener == null){
Log.e(TAG, "Error starting video service");
stateMachine.transitionToState(StreamingStateMachine.ERROR);
@@ -324,22 +336,21 @@ public class VideoStreamManager extends BaseVideoStreamManager {
* Stops streaming, ends video streaming service and removes service listeners.
*/
@Override
- public void dispose(){
+ public void dispose() {
stopStreaming();
hapticManager = null;
remoteDisplay = null;
parameters = null;
virtualDisplayEncoder = null;
- if(internalInterface!=null){
+ if (internalInterface != null) {
internalInterface.stopVideoService();
- }
-
- // Remove listeners
- internalInterface.removeServiceListener(SessionType.NAV, serviceListener);
- internalInterface.removeOnRPCNotificationListener(FunctionID.ON_TOUCH_EVENT, touchListener);
- internalInterface.removeOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, hmiListener);
+ // Remove listeners
+ internalInterface.removeServiceListener(SessionType.NAV, serviceListener);
+ internalInterface.removeOnRPCNotificationListener(FunctionID.ON_TOUCH_EVENT, touchListener);
+ internalInterface.removeOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, hmiListener);
+ }
stateMachine.transitionToState(StreamingStateMachine.NONE);
super.dispose();
}
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java
index acf697a9f..90b895a85 100644
--- a/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java
@@ -316,6 +316,11 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
}
@Override
+ public IVideoStreamListener startVideoStreamEncoder(){
+ return SdlProxyBase.this.startVideoStreamEncoder();
+ }
+
+ @Override
public void stopVideoService() {
if(isConnected()){
sdlSession.endService(SessionType.NAV,sdlSession.getSessionId());
@@ -4917,7 +4922,6 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
}
sdlSession.setDesiredVideoParams(parameters);
-
VideoStreamingParameters acceptedParams = tryStartVideoStream(isEncrypted, parameters);
if (acceptedParams != null) {
return sdlSession.startVideoStream();
@@ -4926,6 +4930,24 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
}
}
+ /**
+ * Starts the stream encoder. The video service should already be started before calling.
+ * @return
+ */
+ public IVideoStreamListener startVideoStreamEncoder(){
+ if(sdlSession == null || !sdlSession.getIsConnected()){
+ DebugTool.logError("Unable to start streaming: SdlSession isn't ready.");
+ return null;
+ }
+ if(sdlSession.getAcceptedVideoParams() == null){
+ DebugTool.logError("Unable to start streaming as the accepted params were null");
+ return null;
+ }
+
+ return sdlSession.startVideoStream();
+
+ }
+
/**
*Closes the opened video service (serviceType 11)
*@return true if the video service is closed successfully, return false otherwise
diff --git a/base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java b/base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java
index ce24b8fe0..7208f4384 100644
--- a/base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java
+++ b/base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java
@@ -103,6 +103,13 @@ public interface ISdl {
IVideoStreamListener startVideoStream(boolean isEncrypted, VideoStreamingParameters parameters);
/**
+ * Starts the actual video encoder
+ * @return the stream listener that will take the bytes to encode them into the negotiated
+ * encoding.
+ */
+ IVideoStreamListener startVideoStreamEncoder();
+
+ /**
* Starts the Audio streaming service
* @param encrypted flag to start this service with encryption or not
*/
diff --git a/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
index c81f0474d..6df12bf5d 100644
--- a/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
+++ b/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
@@ -906,6 +906,12 @@ public class LifecycleManager extends BaseLifecycleManager {
}
@Override
+ public IVideoStreamListener startVideoStreamEncoder() {
+ DebugTool.logWarning("startVideoStreamEncoder is not currently implemented");
+ return null;
+ }
+
+ @Override
public void startAudioService(boolean encrypted, AudioStreamingCodec codec, AudioStreamingParams params) {
DebugTool.logWarning("startAudioService is not currently implemented");
}