From 5d5d08215df8bf8eb7621fd6ae60f7752c644457 Mon Sep 17 00:00:00 2001 From: Noah Stanford Date: Tue, 5 Apr 2022 16:13:25 -0400 Subject: [PATCH 1/2] 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 --- .../encoder/VirtualDisplayEncoder.java | 21 +++++++++++++++++++ .../managers/video/VideoStreamManager.java | 19 +++++++++++++---- 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 322ce0f23b..79515b5eed 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 @@ private Surface prepareVideoEncoder() { // 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 dc91e65c2f..a08405422b 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 void onServiceStarted(SdlSession session, SessionType type, boolean isEnc 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 @@ protected void startStreaming(VideoStreamingParameters parameters, boolean encry /** * 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 @@ private void startEncoder() { } catch (Exception e) { stateMachine.transitionToState(StreamingStateMachine.ERROR); e.printStackTrace(); + return false; } + return true; } /** From 523e8dad7ba2c3d807cbeee0572908b1f16c5e30 Mon Sep 17 00:00:00 2001 From: Noah Stanford Date: Mon, 11 Apr 2022 10:02:13 -0400 Subject: [PATCH 2/2] Add missing spaces to if statements --- .../smartdevicelink/managers/video/VideoStreamManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a08405422b..d51dbd0941 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 @@ -145,14 +145,14 @@ public void onServiceStarted(SdlSession session, SessionType type, boolean isEnc } checkState(); boolean encoderStarted = startEncoder(); - if(encoderStarted) { + 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) { + if (session != null) { session.endService(SessionType.NAV); } }