diff options
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 0f6b6b02d..35fc87683 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 @@ -487,6 +487,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 f8e430529..9874c0d7c 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); + } + } } } @@ -480,7 +489,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()); @@ -497,7 +506,9 @@ public class VideoStreamManager extends BaseVideoStreamManager { } catch (Exception e) { stateMachine.transitionToState(StreamingStateMachine.ERROR); e.printStackTrace(); + return false; } + return true; } /** |