diff options
author | Robert Henigan <robert.henigan@livio.io> | 2020-09-02 13:42:45 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-02 13:42:45 -0400 |
commit | 707a0a9a0620c79e6e8cfb8c269591c5e4cd9c55 (patch) | |
tree | 023379b3c8735a0e45ee6c553c674fe1eba6ed31 | |
parent | d7661acd4cbaef7e865f09469a5e68e87d908999 (diff) | |
download | sdl_android-707a0a9a0620c79e6e8cfb8c269591c5e4cd9c55.tar.gz |
Refactor/streaming calls (#1468)
* Refactor Streaming Calls to manager classes
* Fix Unit Tests
* Make methods protected
* Remove stopAudioService References
9 files changed, 124 insertions, 205 deletions
diff --git a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/audio/AudioStreamManagerTest.java b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/audio/AudioStreamManagerTest.java index 3fd5cd943..4cfa806ad 100644 --- a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/audio/AudioStreamManagerTest.java +++ b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/audio/AudioStreamManagerTest.java @@ -5,9 +5,10 @@ import android.media.AudioFormat; import android.media.MediaFormat;
import android.media.MediaPlayer;
import android.os.Build;
-import androidx.test.platform.app.InstrumentationRegistry;
import android.util.Log;
+import androidx.test.platform.app.InstrumentationRegistry;
+
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.managers.CompletionListener;
import com.smartdevicelink.managers.audio.AudioStreamManager.SampleType;
@@ -93,10 +94,6 @@ public class AudioStreamManagerTest extends TestCase { Boolean encrypted = (Boolean) args[0];
serviceListener.onServiceStarted(mockSession, SessionType.PCM, encrypted);
break;
- case "stopAudioService":
- // parameters ()
- serviceListener.onServiceEnded(mockSession, SessionType.PCM);
- break;
}
return null;
@@ -109,7 +106,6 @@ public class AudioStreamManagerTest extends TestCase { doReturn(audioCapabilities).when(internalInterface).getCapability(SystemCapabilityType.PCM_STREAMING);
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
- doAnswer(audioServiceAnswer).when(internalInterface).stopAudioService();
CompletionListener completionListener = new CompletionListener() {
@Override
@@ -228,7 +224,7 @@ public class AudioStreamManagerTest extends TestCase { testFullAudioManagerDecodeFlowCorrectCounter = 0;
testFullAudioManagerDecodeFlowWrongCounter = 0;
- IAudioStreamListener audioStreamListener = new IAudioStreamListener() {
+ final IAudioStreamListener audioStreamListener = new IAudioStreamListener() {
@Override
public void sendAudio(byte[] data, int offset, int length, long presentationTimeUs) throws ArrayIndexOutOfBoundsException {
ByteBuffer buffer = ByteBuffer.wrap(data, offset, length);
@@ -270,7 +266,6 @@ public class AudioStreamManagerTest extends TestCase { };
final SdlSession mockSession = mock(SdlSession.class);
- doReturn(audioStreamListener).when(mockSession).startAudioStream();
Answer<Void> audioServiceAnswer = new Answer<Void>() {
ISdlServiceListener serviceListener = null;
@@ -292,10 +287,6 @@ public class AudioStreamManagerTest extends TestCase { Boolean encrypted = (Boolean) args[0];
serviceListener.onServiceStarted(mockSession, SessionType.PCM, encrypted);
break;
- case "stopAudioService":
- // parameters ()
- serviceListener.onServiceEnded(mockSession, SessionType.PCM);
- break;
}
return null;
@@ -307,7 +298,6 @@ public class AudioStreamManagerTest extends TestCase { doReturn(audioCapabilities).when(internalInterface).getCapability(any(SystemCapabilityType.class));
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
- doAnswer(audioServiceAnswer).when(internalInterface).stopAudioService();
CompletionListener fileCompletionListener = new CompletionListener() {
@Override
@@ -325,7 +315,12 @@ public class AudioStreamManagerTest extends TestCase { final CompletionListener mockFileListener = spy(fileCompletionListener);
- final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext);
+ final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext) {
+ @Override
+ public IAudioStreamListener startAudioStream(SdlSession session) {
+ return audioStreamListener;
+ }
+ };
manager.startAudioStream(false, new CompletionListener() {
@Override
public void onComplete(boolean success) {
@@ -504,7 +499,6 @@ public class AudioStreamManagerTest extends TestCase { };
final SdlSession mockSession = mock(SdlSession.class);
- doReturn(audioStreamListener).when(mockSession).startAudioStream();
Answer<Void> audioServiceAnswer = new Answer<Void>() {
ISdlServiceListener serviceListener = null;
@@ -526,10 +520,6 @@ public class AudioStreamManagerTest extends TestCase { Boolean encrypted = (Boolean) args[0];
serviceListener.onServiceStarted(mockSession, SessionType.PCM, encrypted);
break;
- case "stopAudioService":
- // parameters ()
- serviceListener.onServiceEnded(mockSession, SessionType.PCM);
- break;
}
return null;
@@ -541,7 +531,6 @@ public class AudioStreamManagerTest extends TestCase { doReturn(audioCapabilities).when(internalInterface).getCapability(any(SystemCapabilityType.class));
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
- doAnswer(audioServiceAnswer).when(internalInterface).stopAudioService();
final MediaPlayer.OnCompletionListener mockPlayerCompletionListener = mock(MediaPlayer.OnCompletionListener.class);
final MediaPlayer player = new MediaPlayer();
@@ -583,14 +572,11 @@ public class AudioStreamManagerTest extends TestCase { public void testPlayRawAudio() {
AudioPassThruCapabilities audioCapabilities = new AudioPassThruCapabilities(SamplingRate._16KHZ, BitsPerSample._16_BIT, AudioType.PCM);
- IAudioStreamListener audioStreamListener = mock(IAudioStreamListener.class);
-
+ final IAudioStreamListener audioStreamListener = mock(IAudioStreamListener.class);
final CompletionListener completionListener = mock(CompletionListener.class);
final SdlSession mockSession = mock(SdlSession.class);
- doReturn(audioStreamListener).when(mockSession).startAudioStream();
-
Answer<Void> audioServiceAnswer = new Answer<Void>() {
ISdlServiceListener serviceListener = null;
@@ -623,7 +609,13 @@ public class AudioStreamManagerTest extends TestCase { doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
- final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext);
+ final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext) {
+ @Override
+ public IAudioStreamListener startAudioStream(SdlSession session) {
+ return audioStreamListener;
+ }
+ };
+
manager.startAudioStream(false, new CompletionListener() {
@Override
public void onComplete(boolean success) {
diff --git a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java index 4c1981099..d99e3e228 100644 --- a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java +++ b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java @@ -960,12 +960,6 @@ public class SystemCapabilityManagerTests { public void startVideoService(VideoStreamingParameters parameters, boolean encrypted) { } @Override - public void stopVideoService() {} - - @Override - public void stopAudioService() {} - - @Override public void sendRPCRequest(RPCRequest message) {} @Override diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java b/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java index f4bdb7136..d9017bd69 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java @@ -35,21 +35,11 @@ package com.smartdevicelink.SdlConnection; import android.content.Context; import com.smartdevicelink.exception.SdlException; -import com.smartdevicelink.protocol.ProtocolMessage; import com.smartdevicelink.protocol.SdlPacket; import com.smartdevicelink.protocol.SdlProtocol; import com.smartdevicelink.protocol.SdlProtocolBase; import com.smartdevicelink.protocol.enums.SessionType; -import com.smartdevicelink.proxy.interfaces.IAudioStreamListener; import com.smartdevicelink.proxy.interfaces.ISdlServiceListener; -import com.smartdevicelink.proxy.interfaces.IVideoStreamListener; -import com.smartdevicelink.proxy.rpc.VideoStreamingFormat; -import com.smartdevicelink.proxy.rpc.enums.VideoStreamingProtocol; -import com.smartdevicelink.streaming.AbstractPacketizer; -import com.smartdevicelink.streaming.IStreamListener; -import com.smartdevicelink.streaming.StreamPacketizer; -import com.smartdevicelink.streaming.video.RTPH264Packetizer; -import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.MultiplexTransportConfig; import com.smartdevicelink.transport.TCPTransportConfig; import com.smartdevicelink.transport.enums.TransportType; @@ -57,7 +47,6 @@ import com.smartdevicelink.util.DebugTool; import com.smartdevicelink.util.MediaStreamingStatus; import com.smartdevicelink.util.Version; -import java.io.IOException; import java.lang.ref.WeakReference; import java.util.concurrent.CopyOnWriteArrayList; @@ -178,13 +167,8 @@ public class SdlSession extends BaseSdlSession { @Override public void onServiceEnded(SdlPacket packet, SessionType serviceType, int sessionID) { - if (SessionType.RPC.equals(serviceType)) { this.sessionListener.onSessionEnded(sessionID); - } else if (SessionType.NAV.equals(serviceType)) { - stopVideoStream(); - } else if (SessionType.PCM.equals(serviceType)) { - stopAudioStream(); } if (serviceListeners != null && serviceListeners.containsKey(serviceType)) { @@ -198,12 +182,6 @@ public class SdlSession extends BaseSdlSession { @Override public void onServiceError(SdlPacket packet, SessionType serviceType, int sessionID, String error) { - if (SessionType.NAV.equals(serviceType)) { - stopVideoStream(); - } else if (SessionType.PCM.equals(serviceType)) { - stopAudioStream(); - } - if (serviceListeners != null && serviceListeners.containsKey(serviceType)) { CopyOnWriteArrayList<ISdlServiceListener> listeners = serviceListeners.get(serviceType); for (ISdlServiceListener listener : listeners) { @@ -215,86 +193,4 @@ public class SdlSession extends BaseSdlSession { @Override public void onAuthTokenReceived(String authToken) {/* Do nothing */ } - /* *********************************************************************************************************************************************************************** - * ***************************************************************** Fix after initial refactor ********************************************************************************* - *************************************************************************************************************************************************************************/ - //FIXME there is a lot of spaghetti code here that needs to be addressed. For first refactor the - // the goal is to only refactor SdlSession. Another PR should be opened to fix all the packetizer - // classes and method calls. - - //FIXME Move this logic to the related streaming manager - private AbstractPacketizer videoPacketizer; - private StreamPacketizer audioPacketizer; - - IStreamListener streamListener = new IStreamListener() { - @Override - public void sendStreamPacket(ProtocolMessage pm) { - sendMessage(pm); - } - }; - - private VideoStreamingProtocol getAcceptedProtocol() { - if (acceptedVideoParams != null) { - VideoStreamingFormat format = acceptedVideoParams.getFormat(); - if (format != null && format.getProtocol() != null) { - return format.getProtocol(); - } - } - //Returns default protocol if none are found - return new VideoStreamingParameters().getFormat().getProtocol(); - - } - - public IVideoStreamListener startVideoStream() { - VideoStreamingProtocol protocol = getAcceptedProtocol(); - try { - switch (protocol) { - case RAW: { - videoPacketizer = new StreamPacketizer(streamListener, null, SessionType.NAV, (byte) this.sessionId, this); - videoPacketizer.start(); - return (IVideoStreamListener) videoPacketizer; - } - case RTP: { - //FIXME why is this not an extension of StreamPacketizer? - videoPacketizer = new RTPH264Packetizer(streamListener, SessionType.NAV, (byte) this.sessionId, this); - videoPacketizer.start(); - return (IVideoStreamListener) videoPacketizer; - } - default: - DebugTool.logError(TAG, "Protocol " + protocol + " is not supported."); - return null; - } - } catch (IOException e) { - return null; - } - } - - public IAudioStreamListener startAudioStream() { - try { - audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) this.sessionId, this); - audioPacketizer.start(); - return audioPacketizer; - } catch (IOException e) { - return null; - } - - } - - - public boolean stopVideoStream() { - if (videoPacketizer != null) { - videoPacketizer.stop(); - return true; - } - return false; - } - - public boolean stopAudioStream() { - if (audioPacketizer != null) { - audioPacketizer.stop(); - return true; - } - return false; - } - } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java index 38bc357b6..f7cc7b7a5 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java @@ -45,6 +45,7 @@ import com.smartdevicelink.SdlConnection.SdlSession; import com.smartdevicelink.managers.CompletionListener;
import com.smartdevicelink.managers.StreamingStateMachine;
import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener;
+import com.smartdevicelink.protocol.ProtocolMessage;
import com.smartdevicelink.protocol.enums.FunctionID;
import com.smartdevicelink.protocol.enums.SessionType;
import com.smartdevicelink.proxy.RPCNotification;
@@ -57,10 +58,13 @@ import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener;
+import com.smartdevicelink.streaming.IStreamListener;
+import com.smartdevicelink.streaming.StreamPacketizer;
import com.smartdevicelink.transport.utl.TransportRecord;
import com.smartdevicelink.util.DebugTool;
import com.smartdevicelink.util.Version;
+import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
@@ -91,6 +95,9 @@ public class AudioStreamManager extends BaseAudioStreamManager { private CompletionListener serviceCompletionListener;
// As the internal interface does not provide timeout we need to use a future task
private final Handler serviceCompletionHandler;
+ private StreamPacketizer audioPacketizer;
+ private SdlSession sdlSession = null;
+ private SessionType sessionType = null;
private final Runnable serviceCompletionTimeoutCallback = new Runnable() {
@Override
@@ -106,10 +113,12 @@ public class AudioStreamManager extends BaseAudioStreamManager { private final ISdlServiceListener serviceListener = new ISdlServiceListener() {
@Override
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
+ sdlSession = session;
+ sessionType = type;
if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
- sdlAudioStream = session.startAudioStream();
+ sdlAudioStream = startAudioStream(session);
streamingStateMachine.transitionToState(StreamingStateMachine.STARTED);
if (serviceCompletionListener != null) {
@@ -125,7 +134,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
- session.stopAudioStream();
+ stopAudioStream();
sdlAudioStream = null;
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -142,6 +151,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
+ stopAudioStream();
streamingStateMachine.transitionToState(StreamingStateMachine.ERROR);
DebugTool.logError(TAG, "OnServiceError: " + reason);
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -338,7 +348,8 @@ public class AudioStreamManager extends BaseAudioStreamManager { streamingStateMachine.transitionToState(StreamingStateMachine.STOPPED);
serviceCompletionListener = completionListener;
serviceCompletionHandler.postDelayed(serviceCompletionTimeoutCallback, COMPLETION_TIMEOUT);
- internalInterface.stopAudioService();
+ stopAudioStream();
+ serviceListener.onServiceEnded(sdlSession, sessionType);
}
/**
@@ -490,4 +501,30 @@ public class AudioStreamManager extends BaseAudioStreamManager { // range of ENCODING_PCM_FLOAT audio data is [-1.0, 1.0].
int FLOAT = Float.SIZE >> 3;
}
+
+ protected IAudioStreamListener startAudioStream(final SdlSession session) {
+
+ IStreamListener streamListener = new IStreamListener() {
+ @Override
+ public void sendStreamPacket(ProtocolMessage pm) {
+ session.sendMessage(pm);
+ }
+ };
+
+ try {
+ audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) session.getSessionId(), session);
+ audioPacketizer.start();
+ return audioPacketizer;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ protected boolean stopAudioStream() {
+ if (audioPacketizer != null) {
+ audioPacketizer.stop();
+ return true;
+ }
+ return false;
+ }
}
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java index 2fe65b2fc..ed3f5f219 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java @@ -225,25 +225,6 @@ public class LifecycleManager extends BaseLifecycleManager { } } - /** - * Closes the opened video service (serviceType 11) - * - * @return true if the video service is closed successfully, return false otherwise - */ - @Override - void endVideoStream() { - if (session == null) { - DebugTool.logWarning(TAG, "SdlSession is not created yet."); - return; - } - if (!session.getIsConnected()) { - DebugTool.logWarning(TAG, "Connection is not available."); - return; - } - - session.stopVideoStream(); - } - @Override void startAudioService(boolean isEncrypted) { if (session == null) { @@ -256,23 +237,4 @@ public class LifecycleManager extends BaseLifecycleManager { } session.startService(SessionType.PCM, isEncrypted); } - - /** - * Closes the opened audio service (serviceType 10) - * - * @return true if the audio service is closed successfully, return false otherwise - */ - @Override - void endAudioStream() { - if (session == null) { - DebugTool.logWarning(TAG, "SdlSession is not created yet."); - return; - } - if (!session.getIsConnected()) { - DebugTool.logWarning(TAG, "Connection is not available."); - return; - } - - session.stopAudioStream(); - } } 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 81db89049..a55cecb4d 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 @@ -46,6 +46,7 @@ import com.smartdevicelink.managers.BaseSubManager; import com.smartdevicelink.managers.CompletionListener; import com.smartdevicelink.managers.StreamingStateMachine; import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener; +import com.smartdevicelink.protocol.ProtocolMessage; import com.smartdevicelink.protocol.enums.FunctionID; import com.smartdevicelink.protocol.enums.SessionType; import com.smartdevicelink.proxy.RPCNotification; @@ -59,18 +60,25 @@ import com.smartdevicelink.proxy.rpc.OnTouchEvent; import com.smartdevicelink.proxy.rpc.TouchCoord; import com.smartdevicelink.proxy.rpc.TouchEvent; import com.smartdevicelink.proxy.rpc.VideoStreamingCapability; +import com.smartdevicelink.proxy.rpc.VideoStreamingFormat; import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows; import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType; import com.smartdevicelink.proxy.rpc.enums.TouchType; +import com.smartdevicelink.proxy.rpc.enums.VideoStreamingProtocol; import com.smartdevicelink.proxy.rpc.enums.VideoStreamingState; import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener; +import com.smartdevicelink.streaming.AbstractPacketizer; +import com.smartdevicelink.streaming.IStreamListener; +import com.smartdevicelink.streaming.StreamPacketizer; +import com.smartdevicelink.streaming.video.RTPH264Packetizer; import com.smartdevicelink.streaming.video.SdlRemoteDisplay; import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.utl.TransportRecord; import com.smartdevicelink.util.DebugTool; import com.smartdevicelink.util.Version; +import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -95,6 +103,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { private boolean isTransportAvailable = false; private boolean hasStarted; private String vehicleMake = null; + private AbstractPacketizer videoPacketizer; // INTERNAL INTERFACES @@ -104,7 +113,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { if(SessionType.NAV.equals(type)){ if (session != null && session.getAcceptedVideoParams() != null) { parameters = session.getAcceptedVideoParams(); - VideoStreamManager.this.streamListener = session.startVideoStream(); + VideoStreamManager.this.streamListener = startVideoStream(session.getAcceptedVideoParams(), session); } if (VideoStreamManager.this.streamListener == null) { @@ -125,6 +134,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { @Override public void onServiceEnded(SdlSession session, SessionType type) { if(SessionType.NAV.equals(type)){ + stopVideoStream(); if(remoteDisplay!=null){ stopStreaming(); } @@ -136,6 +146,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { @Override public void onServiceError(SdlSession session, SessionType type, String reason) { DebugTool.logError(TAG, "Unable to start video service: " + reason); + stopVideoStream(); stateMachine.transitionToState(StreamingStateMachine.ERROR); transitionToState(BaseSubManager.ERROR); } @@ -156,7 +167,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { } checkState(); if (hasStarted && (isHMIStateVideoStreamCapable(prevOnHMIStatus)) && (!isHMIStateVideoStreamCapable(currentOnHMIStatus))) { - internalInterface.stopVideoService(); + stopVideoStream(); } } } @@ -375,13 +386,13 @@ public class VideoStreamManager extends BaseVideoStreamManager { parameters = null; virtualDisplayEncoder = 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); } + stopVideoStream(); stateMachine.transitionToState(StreamingStateMachine.NONE); @@ -704,4 +715,57 @@ public class VideoStreamManager extends BaseVideoStreamManager { } } + private VideoStreamingProtocol getAcceptedProtocol(VideoStreamingParameters params) { + if (params != null) { + VideoStreamingFormat format = params.getFormat(); + if (format != null && format.getProtocol() != null) { + return format.getProtocol(); + } + } + //Returns default protocol if none are found + return new VideoStreamingParameters().getFormat().getProtocol(); + + } + + protected IVideoStreamListener startVideoStream(VideoStreamingParameters params, final SdlSession session) { + VideoStreamingProtocol protocol = getAcceptedProtocol(params); + + IStreamListener iStreamListener = new IStreamListener() { + @Override + public void sendStreamPacket(ProtocolMessage pm) { + session.sendMessage(pm); + } + }; + + try { + switch (protocol) { + case RAW: { + videoPacketizer = new StreamPacketizer(iStreamListener, null, SessionType.NAV, (byte) session.getSessionId(), session); + videoPacketizer.start(); + return (IVideoStreamListener) videoPacketizer; + } + case RTP: { + //FIXME why is this not an extension of StreamPacketizer? + videoPacketizer = new RTPH264Packetizer(iStreamListener, SessionType.NAV, (byte) session.getSessionId(), session); + videoPacketizer.start(); + return (IVideoStreamListener) videoPacketizer; + } + default: + DebugTool.logError(TAG, "Protocol " + protocol + " is not supported."); + return null; + } + } catch (IOException e) { + return null; + } + + } + + protected boolean stopVideoStream() { + if (videoPacketizer != null) { + videoPacketizer.stop(); + return true; + } + return false; + } + } 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 new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java diff --git a/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java b/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java index 77fac4cfe..e83c0e843 100644 --- a/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java +++ b/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java @@ -947,11 +947,6 @@ abstract class BaseLifecycleManager { } @Override - public void stopVideoService() { - BaseLifecycleManager.this.endVideoStream(); - } - - @Override public IVideoStreamListener startVideoStream(boolean isEncrypted, VideoStreamingParameters parameters) { DebugTool.logWarning(TAG, "startVideoStream is not currently implemented"); return null; @@ -968,11 +963,6 @@ abstract class BaseLifecycleManager { } @Override - public void stopAudioService() { - BaseLifecycleManager.this.endAudioStream(); - } - - @Override public IAudioStreamListener startAudioStream(boolean isEncrypted, AudioStreamingCodec codec, AudioStreamingParams params) { DebugTool.logWarning(TAG, "startAudioStream is not currently implemented"); return null; @@ -1273,15 +1263,9 @@ abstract class BaseLifecycleManager { void startVideoService(boolean encrypted, VideoStreamingParameters parameters) { } - void endVideoStream() { - } - void startAudioService(boolean encrypted) { } - void endAudioStream() { - } - void setSdlSecurityStaticVars() { } 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 6a1b1b97d..0c46e3743 100644 --- a/base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java +++ b/base/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java @@ -94,11 +94,6 @@ public interface ISdl { void startVideoService(VideoStreamingParameters parameters, boolean encrypted); /** - * Stops the video service if open - */ - void stopVideoService(); - - /** * Starts the video streaming service * @param isEncrypted flag to start this service with encryption or not * @param parameters desired video streaming params for this sevice to be started with @@ -120,11 +115,6 @@ public interface ISdl { void startAudioService(boolean encrypted); /** - * Stops the audio service if open - */ - void stopAudioService(); - - /** * Start Audio Stream and return IAudioStreamListener * @param isEncrypted whether or not the audio stream should be encrypted * @param codec the codec that should be used for the audio stream |