From c163c173e2b00c5e502b155d3a051c6f3bf4e6c5 Mon Sep 17 00:00:00 2001 From: noah-livio <95378272+noah-livio@users.noreply.github.com> Date: Mon, 11 Apr 2022 13:20:32 -0400 Subject: 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 --- .../encoder/VirtualDisplayEncoder.java | 21 +++++++++++++++++++++ .../managers/video/VideoStreamManager.java | 19 +++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) (limited to 'android') 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; } /** -- cgit v1.2.1