summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2019-03-28 18:31:39 -0400
committerGitHub <noreply@github.com>2019-03-28 18:31:39 -0400
commit5ba744ce22d20c87463d34d3d44beb4f2fabe2b9 (patch)
treed1e13b36ff869f2308c0f431c7a341d9f7809233
parent2b72ffbb9f4bb399399dbbad1b03cc85904baf99 (diff)
downloadsdl_android-5ba744ce22d20c87463d34d3d44beb4f2fabe2b9.tar.gz
Fix issue with VPM and multi transports (#1022)
* Refactor VPM to specifically start video service * tryVideoStream checks if service is started * Fix unit test issue * Update proxy VPM for manual service start flow * Update javadoc for proxy non-deprecated video start
-rw-r--r--android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamManagerTests.java10
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java60
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java71
3 files changed, 85 insertions, 56 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..5e291c736 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
@@ -40,6 +40,8 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
@@ -116,7 +118,7 @@ public class VideoStreamManagerTests extends AndroidTestCase2 {
}
public void testHMILevelNotFull(){
- ISdl internalInterface = mock(ISdl.class);
+ final ISdl internalInterface = mock(ISdl.class);
when(internalInterface.getProtocolVersion()).thenReturn((new Version(5,0,0)));
when(internalInterface.isCapabilitySupported(SystemCapabilityType.VIDEO_STREAMING)).thenReturn(true);
@@ -125,8 +127,10 @@ public class VideoStreamManagerTests extends AndroidTestCase2 {
videoStreamManager.start(new CompletionListener() {
@Override
public void onComplete(boolean success) {
- assertNull(videoStreamManager.startVideoService(
- new VideoStreamingParameters(), false));
+ VideoStreamingParameters params = new VideoStreamingParameters();
+ boolean encrypted = false;
+ videoStreamManager.startStreaming(params, encrypted);
+ verify(internalInterface, times(0)).startVideoService(params, encrypted);
}
});
}
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..4f8bac23c 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
@@ -66,7 +66,23 @@ public class VideoStreamManager extends BaseVideoStreamManager {
@Override
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
if(SessionType.NAV.equals(type)){
- stateMachine.transitionToState(StreamingStateMachine.READY);
+ if(session != null && session.getAcceptedVideoParams() != null){
+ parameters = session.getAcceptedVideoParams();
+ }
+ VideoStreamManager.this.streamListener = internalInterface.startVideoStream(isEncrypted, parameters);
+ if(streamListener == null){
+ Log.e(TAG, "Error starting video service");
+ stateMachine.transitionToState(StreamingStateMachine.ERROR);
+ return;
+ }
+ VideoStreamingCapability capability = (VideoStreamingCapability) internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING);
+ if(capability != null && capability.getIsHapticSpatialDataSupported()){
+ hapticManager = new HapticInterfaceManager(internalInterface);
+ }
+ startEncoder();
+ stateMachine.transitionToState(StreamingStateMachine.STARTED);
+
+
}
}
@@ -229,31 +245,6 @@ 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
- * 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
- */
- protected IVideoStreamListener startVideoService(VideoStreamingParameters parameters, boolean encrypted){
- if(hmiLevel != HMILevel.HMI_FULL){
- Log.e(TAG, "Cannot start video service if HMILevel is not FULL.");
- return null;
- }
- IVideoStreamListener listener = internalInterface.startVideoStream(encrypted, parameters);
- if(listener != null){
- stateMachine.transitionToState(StreamingStateMachine.STARTED);
- }else{
- stateMachine.transitionToState(StreamingStateMachine.ERROR);
- }
- return listener;
- }
/**
* Starts video service, sets up encoder, haptic manager, and remote display. Begins streaming the remote display.
@@ -261,19 +252,16 @@ public class VideoStreamManager extends BaseVideoStreamManager {
* 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
*/
- private void startStreaming(VideoStreamingParameters parameters, boolean encrypted){
+ protected void startStreaming(VideoStreamingParameters parameters, boolean encrypted){
this.parameters = parameters;
- this.streamListener = startVideoService(parameters, encrypted);
- if(streamListener == null){
- Log.e(TAG, "Error starting video service");
- stateMachine.transitionToState(StreamingStateMachine.ERROR);
+ if(hmiLevel != HMILevel.HMI_FULL){
+ Log.e(TAG, "Cannot start video service if HMILevel is not FULL.");
return;
}
- VideoStreamingCapability capability = (VideoStreamingCapability) internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING);
- if(capability != null && capability.getIsHapticSpatialDataSupported()){
- hapticManager = new HapticInterfaceManager(internalInterface);
- }
- startEncoder();
+ //Start the video service
+ this.internalInterface.startVideoService(parameters, encrypted);
+
+
}
/**
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..e622ae0dd 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
@@ -4895,8 +4895,12 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
/**
* 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
+ * to the app to send video data. The supplied VideoStreamingParameters will be set as desired parameters
* that will be used to negotiate
+ *
+ * <br><br><b>NOTE: IF USING SECONDARY TRANSPORTS, THE VIDEO SERVICE MUST BE STARTED BEFORE CALLING THIS
+ * THIS METHOD. USE A `ISdlServiceListener` TO BE NOTIFIED THAT IT STARTS THEN CALL THIS METHOD TO
+ * START STREAMING. ADD A LISTENER USE {@link #addServiceListener(SessionType, ISdlServiceListener)}.</b>
*
* @param isEncrypted Specify true if packets on this service have to be encrypted
* @param parameters Video streaming parameters including: codec which will be used for streaming (currently, only
@@ -4904,6 +4908,8 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
*
* @return IVideoStreamListener interface if service is opened successfully and streaming is
* started, null otherwise
+ *
+ * @see ISdlServiceListener
*/
@SuppressWarnings("unused")
public IVideoStreamListener startVideoStream(boolean isEncrypted, VideoStreamingParameters parameters) {
@@ -5094,21 +5100,24 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
return null;
}
- sdlSession.setDesiredVideoParams(parameters);
+ if(!navServiceStartResponseReceived || !navServiceStartResponse //If we haven't started the service before
+ || (navServiceStartResponse && isEncrypted && !sdlSession.isServiceProtected(SessionType.NAV))) { //Or the service has been started but we'd like to start an encrypted one
+ sdlSession.setDesiredVideoParams(parameters);
- navServiceStartResponseReceived = false;
- navServiceStartResponse = false;
- navServiceStartRejectedParams = null;
+ navServiceStartResponseReceived = false;
+ navServiceStartResponse = false;
+ navServiceStartRejectedParams = null;
- sdlSession.startService(SessionType.NAV, sdlSession.getSessionId(), isEncrypted);
+ sdlSession.startService(SessionType.NAV, sdlSession.getSessionId(), isEncrypted);
- FutureTask<Void> fTask = createFutureTask(new CallableMethod(RESPONSE_WAIT_TIME));
- ScheduledExecutorService scheduler = createScheduler();
- scheduler.execute(fTask);
+ FutureTask<Void> fTask = createFutureTask(new CallableMethod(RESPONSE_WAIT_TIME));
+ ScheduledExecutorService scheduler = createScheduler();
+ scheduler.execute(fTask);
- //noinspection StatementWithEmptyBody
- while (!navServiceStartResponseReceived && !fTask.isDone());
- scheduler.shutdown();
+ //noinspection StatementWithEmptyBody
+ while (!navServiceStartResponseReceived && !fTask.isDone()) ;
+ scheduler.shutdown();
+ }
if (navServiceStartResponse) {
if(protocolVersion!= null && protocolVersion.getMajor() < 5){ //Versions 1-4 do not support streaming parameter negotiations
@@ -7827,6 +7836,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
float[] touchScalar = {1.0f,1.0f}; //x, y
private HapticInterfaceManager hapticManager;
SdlMotionEvent sdlMotionEvent = null;
+ VideoStreamingParameters videoStreamingParameters;
public VideoStreamingManager(Context context,ISdl iSdl){
this.context = context;
@@ -7847,8 +7857,30 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
});
}
+ /**
+ * Starts the video service, caches the supplied params and prepares for the stream to start.
+ * @param remoteDisplayClass the extension of SdlRemoteDisplay that will be streamed
+ * @param parameters desired video streaming params
+ * @param encrypted if the service is to be encrypted or not
+ */
public void startVideoStreaming(Class<? extends SdlRemoteDisplay> remoteDisplayClass, VideoStreamingParameters parameters, boolean encrypted){
- streamListener = startVideoStream(encrypted,parameters);
+ this.remoteDisplayClass = remoteDisplayClass;
+ this.videoStreamingParameters = parameters;
+ //Make sure the service is started, allows multi transports to connect and register without timing out
+ internalInterface.startVideoService(parameters, encrypted);
+ //After this, look to the
+ }
+
+ /**
+ * The video service should already be started at this point. Once called, it will start
+ * the encoders and fire up the remote display supplied by the user
+ * @param parameters
+ * @param encrypted
+ */
+ private void startStream(VideoStreamingParameters parameters, boolean encrypted){
+ //Start the service first
+ //streamListener = startVideoStream(encrypted,parameters);d
+ streamListener = sdlSession.startVideoStream();
if(streamListener == null){
Log.e(TAG, "Error starting video service");
return;
@@ -7857,9 +7889,9 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
if(capability != null && capability.getIsHapticSpatialDataSupported()){
hapticManager = new HapticInterfaceManager(internalInterface);
}
- this.remoteDisplayClass = remoteDisplayClass;
+
try {
- encoder.init(context,streamListener,parameters);
+ encoder.init(context, streamListener, parameters);
//We are all set so we can start streaming at at this point
encoder.start();
//Encoder should be up and running
@@ -7962,8 +7994,13 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
@Override
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
-
-
+ if(SessionType.NAV.equals(type) && session != null ){
+ DebugTool.logInfo("Video service has been started. Starting video stream from proxy");
+ if(session.getAcceptedVideoParams() != null){
+ videoStreamingParameters = session.getAcceptedVideoParams();
+ }
+ startStream(videoStreamingParameters, isEncrypted);
+ }
}
@Override