From c8869551574b13a665e1775a1e084d5a293c8496 Mon Sep 17 00:00:00 2001 From: nocturnalprelude Date: Thu, 17 Jul 2014 13:00:28 +0200 Subject: [PATCH] Update VideoStream.java This trick will avoid to have stretched video preview when starting the camera --- .../streaming/video/VideoStream.java | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/src/net/majorkernelpanic/streaming/video/VideoStream.java b/src/net/majorkernelpanic/streaming/video/VideoStream.java index 165fb8db..9966f9a1 100644 --- a/src/net/majorkernelpanic/streaming/video/VideoStream.java +++ b/src/net/majorkernelpanic/streaming/video/VideoStream.java @@ -683,6 +683,133 @@ protected void unlockCamera() { } + + + +public void setCameraPreviewSize(int w, int h) { + + List size = getSizes(); + Size size_to_use = getOptimalSize(size, w, h); + + System.out.println("Setting preview to: "+ w + h); + + if (mCamera != null) { + + if (mStreaming && mMode == MODE_MEDIARECORDER_API) { + lockCamera(); + } + + Parameters parameters = mCamera.getParameters(); + + parameters.setPreviewSize(size_to_use.width, size_to_use.height); + //parameters.setPreviewSize(176, 144); + try { + mCamera.setParameters(parameters); + System.out.println("Setting preview to: "+ size_to_use.width + size_to_use.height + " DONE!!"); + Size z = parameters.getPreviewSize(); + int w_temp = z.width; + int h_temp = z.height; + System.out.println("Saved preview is: "+ w_temp + h_temp); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + else { + System.out.println("Setting preview to: "+ w + h + " FAILED!!"); + } + + + + } + + + public synchronized List getSizes() { + + List size = null; + + if (mCamera != null) { + + if (mStreaming && mMode == MODE_MEDIARECORDER_API) { + lockCamera(); + } + + + try { + + Parameters parameters = mCamera.getParameters(); + size = parameters.getSupportedPreviewSizes(); + + System.out.println("Some of the supported preview is " + size.get(0).width + "x" + size.get(0).height); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + + + + } + + else { + System.out.println("Failed to get preview sizes"); + } + + return size; + } + + + + private Size getOptimalSize(List sizes, int w, int h) { + + final double ASPECT_TOLERANCE = 0.2; + double targetRatio = (double) w / h; + if (sizes == null) + return null; + Size optimalSize = null; + double minDiff = Double.MAX_VALUE; + int targetHeight = h; + // Try to find an size match aspect ratio and size + for (Size size : sizes) + { + + double ratio = (double) size.width / size.height; + if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) + continue; + if (Math.abs(size.height - targetHeight) < minDiff) + { + optimalSize = size; + minDiff = Math.abs(size.height - targetHeight); + } + } + // Cannot find the one match the aspect ratio, ignore the requirement + + if (optimalSize == null) + { + minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - targetHeight) < minDiff) + { + optimalSize = size; + minDiff = Math.abs(size.height - targetHeight); + } + } + } + + + + return optimalSize; + } + + + + + + + /** * Computes the average frame rate at which the preview callback is called. * We will then use this average framerate with the MediaCodec.