summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authornoah-livio <95378272+noah-livio@users.noreply.github.com>2022-04-11 13:20:32 -0400
committerGitHub <noreply@github.com>2022-04-11 13:20:32 -0400
commitc163c173e2b00c5e502b155d3a051c6f3bf4e6c5 (patch)
tree6ceb973467ad149d88419dcc5087b0a94517cc12 /android
parent1abdbf8e59881cba2c54e47fef9c1e4ecb929063 (diff)
downloadsdl_android-c163c173e2b00c5e502b155d3a051c6f3bf4e6c5.tar.gz
Improve handling of unsupported resolutions (#1804)
* Improve handling of unsupported resolutions Adds a check in VirtualDisplayEncoder for unsupported resolutions that makes the virtual display encoder fail to start, prints a more helpful error message, and propagates an exception to the video stream manager Changes in VideoStreamManager now kill the video stream service when the encoder fails to start, allowing for subsequent streams to start after an encoder error * Add missing spaces to if statements
Diffstat (limited to 'android')
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/encoder/VirtualDisplayEncoder.java21
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java19
2 files changed, 36 insertions, 4 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/encoder/VirtualDisplayEncoder.java b/android/sdl_android/src/main/java/com/smartdevicelink/encoder/VirtualDisplayEncoder.java
index 322ce0f23..79515b5ee 100644
--- a/android/sdl_android/src/main/java/com/smartdevicelink/encoder/VirtualDisplayEncoder.java
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/encoder/VirtualDisplayEncoder.java
@@ -480,6 +480,27 @@ public class VirtualDisplayEncoder {
// Create a MediaCodec encoder and configure it. Get a Surface we can use for recording into.
try {
mVideoEncoder = MediaCodec.createEncoderByType(videoMimeType);
+
+ int width = streamingParams.getResolution().getResolutionWidth();
+ int height = streamingParams.getResolution().getResolutionHeight();
+ int frameRate = streamingParams.getFrameRate();
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+ boolean streamSupported = mVideoEncoder.getCodecInfo()
+ .getCapabilitiesForType(videoMimeType)
+ .getVideoCapabilities()
+ .areSizeAndRateSupported(width, height, frameRate);
+
+ if (!streamSupported) {
+ String errorString = "Video streaming " + width + " by " + height + " at "
+ + frameRate + "fps is unsupported on this device";
+
+ DebugTool.logError(TAG, errorString);
+
+ return null;
+ }
+ }
+
mVideoEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface surface = mVideoEncoder.createInputSurface(); //prepared
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 dc91e65c2..d51dbd094 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
@@ -144,9 +144,18 @@ public class VideoStreamManager extends BaseVideoStreamManager {
hapticManager = new HapticInterfaceManager(internalInterface);
}
checkState();
- startEncoder();
- stateMachine.transitionToState(StreamingStateMachine.STARTED);
- hasStarted = true;
+ boolean encoderStarted = startEncoder();
+ if (encoderStarted) {
+ stateMachine.transitionToState(StreamingStateMachine.STARTED);
+ hasStarted = true;
+ } else {
+ DebugTool.logError(TAG, "Error starting video encoder");
+ stateMachine.transitionToState(StreamingStateMachine.ERROR);
+ withPendingRestart = false;
+ if (session != null) {
+ session.endService(SessionType.NAV);
+ }
+ }
}
}
@@ -473,7 +482,7 @@ public class VideoStreamManager extends BaseVideoStreamManager {
/**
* Initializes and starts the virtual display encoder and creates the remote display
*/
- private void startEncoder() {
+ private boolean startEncoder() {
try {
if (remoteDisplay != null) {
remoteDisplay.resizeView(parameters.getResolution().getResolutionWidth(), parameters.getResolution().getResolutionHeight());
@@ -490,7 +499,9 @@ public class VideoStreamManager extends BaseVideoStreamManager {
} catch (Exception e) {
stateMachine.transitionToState(StreamingStateMachine.ERROR);
e.printStackTrace();
+ return false;
}
+ return true;
}
/**