diff options
author | noah-livio <95378272+noah-livio@users.noreply.github.com> | 2022-04-11 13:20:32 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-11 13:20:32 -0400 |
commit | c163c173e2b00c5e502b155d3a051c6f3bf4e6c5 (patch) | |
tree | 6ceb973467ad149d88419dcc5087b0a94517cc12 /android | |
parent | 1abdbf8e59881cba2c54e47fef9c1e4ecb929063 (diff) | |
download | sdl_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')
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; } /** |