summaryrefslogtreecommitdiff
path: root/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
diff options
context:
space:
mode:
Diffstat (limited to 'modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java')
-rw-r--r--modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java44
1 files changed, 42 insertions, 2 deletions
diff --git a/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java b/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
index 926b350e..2ebf911f 100644
--- a/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
+++ b/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
@@ -11,11 +11,13 @@
package org.webrtc.videoengine;
import java.io.IOException;
+import java.util.List;
import java.util.concurrent.Exchanger;
import android.content.Context;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
+import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera;
import android.opengl.GLES11Ext;
@@ -58,6 +60,7 @@ public class VideoCaptureAndroid implements PreviewCallback, Callback {
private double averageDurationMs;
private long lastCaptureTimeMs;
private int frameCount;
+ private int frameDropRatio;
// Requests future capturers to send their frames to |localPreview| directly.
public static void setLocalPreview(SurfaceHolder localPreview) {
@@ -169,8 +172,40 @@ public class VideoCaptureAndroid implements PreviewCallback, Callback {
if (parameters.isVideoStabilizationSupported()) {
parameters.setVideoStabilization(true);
}
+ parameters.setPictureSize(width, height);
parameters.setPreviewSize(width, height);
+
+ // Check if requested fps range is supported by camera,
+ // otherwise calculate frame drop ratio.
+ List<int[]> supportedFpsRanges = parameters.getSupportedPreviewFpsRange();
+ frameDropRatio = Integer.MAX_VALUE;
+ for (int i = 0; i < supportedFpsRanges.size(); i++) {
+ int[] range = supportedFpsRanges.get(i);
+ if (range[Parameters.PREVIEW_FPS_MIN_INDEX] == min_mfps &&
+ range[Parameters.PREVIEW_FPS_MAX_INDEX] == max_mfps) {
+ frameDropRatio = 1;
+ break;
+ }
+ if (range[Parameters.PREVIEW_FPS_MIN_INDEX] % min_mfps == 0 &&
+ range[Parameters.PREVIEW_FPS_MAX_INDEX] % max_mfps == 0) {
+ int dropRatio = range[Parameters.PREVIEW_FPS_MAX_INDEX] / max_mfps;
+ frameDropRatio = Math.min(dropRatio, frameDropRatio);
+ }
+ }
+ if (frameDropRatio == Integer.MAX_VALUE) {
+ Log.e(TAG, "Can not find camera fps range");
+ error = new RuntimeException("Can not find camera fps range");
+ exchange(result, false);
+ return;
+ }
+ if (frameDropRatio > 1) {
+ Log.d(TAG, "Frame dropper is enabled. Ratio: " + frameDropRatio);
+ }
+ min_mfps *= frameDropRatio;
+ max_mfps *= frameDropRatio;
+ Log.d(TAG, "Camera preview mfps range: " + min_mfps + " - " + max_mfps);
parameters.setPreviewFpsRange(min_mfps, max_mfps);
+
int format = ImageFormat.NV21;
parameters.setPreviewFormat(format);
camera.setParameters(parameters);
@@ -180,7 +215,7 @@ public class VideoCaptureAndroid implements PreviewCallback, Callback {
}
camera.setPreviewCallbackWithBuffer(this);
frameCount = 0;
- averageDurationMs = 1000 / max_mfps;
+ averageDurationMs = 1000000.0f / (max_mfps / frameDropRatio);
camera.startPreview();
exchange(result, true);
return;
@@ -296,8 +331,13 @@ public class VideoCaptureAndroid implements PreviewCallback, Callback {
throw new RuntimeException("Unexpected camera in callback!");
}
frameCount++;
+ // Check if frame needs to be dropped.
+ if ((frameDropRatio > 1) && (frameCount % frameDropRatio) > 0) {
+ camera.addCallbackBuffer(data);
+ return;
+ }
long captureTimeMs = SystemClock.elapsedRealtime();
- if (frameCount > 1) {
+ if (frameCount > frameDropRatio) {
double durationMs = captureTimeMs - lastCaptureTimeMs;
averageDurationMs = 0.9 * averageDurationMs + 0.1 * durationMs;
if ((frameCount % 30) == 0) {