diff options
author | Joey Grover <joeygrover@gmail.com> | 2019-03-27 18:02:20 -0400 |
---|---|---|
committer | Joey Grover <joeygrover@gmail.com> | 2019-03-27 18:02:20 -0400 |
commit | 204469fb0086d61b0fd12a72f22da05e5c4ace07 (patch) | |
tree | e4d6db667a5b5dc689656f32c62fa46c5d9b6f2e | |
parent | cef1cbb1e8a36d172bda93866c2160c64b01b9de (diff) | |
download | sdl_android-bugfix/fix_start_vid_service.tar.gz |
Create new async flow for video streamingbugfix/fix_start_vid_service
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"); } |