From 17801e80f1f2a28384ce2dbfa04cc0bac68cc369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Agostinho?= Date: Wed, 25 Feb 2015 18:16:36 +0100 Subject: [PATCH 1/2] fix to VideoQuality.determineClosestSupportedResolution --- src/net/majorkernelpanic/streaming/video/VideoQuality.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/net/majorkernelpanic/streaming/video/VideoQuality.java b/src/net/majorkernelpanic/streaming/video/VideoQuality.java index 8c857f86..e215e4e2 100644 --- a/src/net/majorkernelpanic/streaming/video/VideoQuality.java +++ b/src/net/majorkernelpanic/streaming/video/VideoQuality.java @@ -107,13 +107,13 @@ public String toString() { **/ public static VideoQuality determineClosestSupportedResolution(Camera.Parameters parameters, VideoQuality quality) { VideoQuality v = quality.clone(); - int minDist = Integer.MAX_VALUE; + float minDist = Float.MAX_VALUE; String supportedSizesStr = "Supported resolutions: "; List supportedSizes = parameters.getSupportedPreviewSizes(); for (Iterator it = supportedSizes.iterator(); it.hasNext();) { Size size = it.next(); supportedSizesStr += size.width+"x"+size.height+(it.hasNext()?", ":""); - int dist = Math.abs(quality.resX - size.width); + float dist = (float) Math.sqrt(Math.pow(quality.resX - size.width, 2) + Math.pow(quality.resY - size.height, 2)); if (dist Date: Mon, 2 Mar 2015 12:59:12 +0100 Subject: [PATCH 2/2] implemented VideoQuality.determineClosestSupportedFramerate --- .../streaming/video/VideoQuality.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/net/majorkernelpanic/streaming/video/VideoQuality.java b/src/net/majorkernelpanic/streaming/video/VideoQuality.java index e215e4e2..91ef4bb9 100644 --- a/src/net/majorkernelpanic/streaming/video/VideoQuality.java +++ b/src/net/majorkernelpanic/streaming/video/VideoQuality.java @@ -144,4 +144,31 @@ public static int[] determineMaximumSupportedFramerate(Camera.Parameters paramet return maxFps; } + /** + * Compares the framerate requested by the session with the ones available by the camera + * Since we're comparing a single value with the interval, it chooses intervals whose average + * fps value is closest to the requested one, e.g., if one requests 30fps and the camera + * supports 15-30,30-30, and 60-60. It will select 30-30; + * Given these are fps ranges of real cameras we should not see troublesome situations like a + * choice between 15-45 and 30-30, which in this case would give precedence to the first. + **/ + public static int[] determineClosestSupportedFramerate(Camera.Parameters parameters, VideoQuality quality) { + int[] fps = new int[]{0,0}; + int fr = quality.framerate * 1000; + float dist = Float.MAX_VALUE; + String supportedFpsRangesStr = "Supported frame rates: "; + List supportedFpsRanges = parameters.getSupportedPreviewFpsRange(); + for (Iterator it = supportedFpsRanges.iterator(); it.hasNext();) { + int[] interval = it.next(); + // Intervals are returned as integers, for example "29970" means "29.970" FPS. + supportedFpsRangesStr += interval[0]/1000+"-"+interval[1]/1000+"fps"+(it.hasNext()?", ":""); + float testDist = Math.abs((interval[0] + interval[1])/2 - fr); + if(testDist < dist) { + fps = interval; + dist = testDist; + } + } + Log.v(TAG,supportedFpsRangesStr); + return fps; + } }