diff --git a/src/org/linphone/core/video/AndroidCameraRecord.java b/src/org/linphone/core/video/AndroidCameraRecord.java index 27bd02c63..ae477302e 100644 --- a/src/org/linphone/core/video/AndroidCameraRecord.java +++ b/src/org/linphone/core/video/AndroidCameraRecord.java @@ -25,6 +25,7 @@ import java.util.List; import org.linphone.core.Version; import android.hardware.Camera; +import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.ErrorCallback; import android.hardware.Camera.Parameters; import android.hardware.Camera.PreviewCallback; @@ -32,9 +33,11 @@ import android.hardware.Camera.Size; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.view.View; +import android.view.View.OnClickListener; -public abstract class AndroidCameraRecord { +public abstract class AndroidCameraRecord implements AutoFocusCallback { protected Camera camera; private RecorderParams params; @@ -125,6 +128,19 @@ public abstract class AndroidCameraRecord { previewStarted = true; + // Activate autofocus + if (Camera.Parameters.FOCUS_MODE_AUTO.equals(parameters.getFocusMode())) { + OnClickListener svClickListener = new OnClickListener() { + public void onClick(View v) { + Log.i(tag, "Auto focus requested"); + camera.autoFocus(AndroidCameraRecord.this); + } + }; + params.surfaceView.setOnClickListener(svClickListener); + // svClickListener.onClick(null); + } else { + params.surfaceView.setOnClickListener(null); + } // Register callback to get capture buffer lowLevelSetPreviewCallback(camera, storedPreviewCallback); @@ -151,7 +167,7 @@ public abstract class AndroidCameraRecord { public void storePreviewCallBack(PreviewCallback cb) { this.storedPreviewCallback = cb; if (camera == null) { - Log.w(tag, "Capture camera not ready, storing callback"); + Log.w(tag, "Capture camera not ready, storing preview callback"); return; } @@ -165,6 +181,7 @@ public abstract class AndroidCameraRecord { camera.stopPreview(); camera.release(); camera=null; + Log.d(tag, "Camera released"); currentPreviewSize = null; previewStarted = false; } @@ -189,6 +206,7 @@ public abstract class AndroidCameraRecord { final long filterDataNativePtr; public int cameraId; + public boolean isFrontCamera; public int rotation; public SurfaceView surfaceView; @@ -215,5 +233,9 @@ public abstract class AndroidCameraRecord { return currentPreviewSize.width * currentPreviewSize.height * 3 /2; } - + + public void onAutoFocus(boolean success, Camera camera) { + if (success) Log.i(tag, "Autofocus success"); + else Log.i(tag, "Autofocus failure"); + } } diff --git a/src/org/linphone/core/video/AndroidCameraRecord5.java b/src/org/linphone/core/video/AndroidCameraRecord5.java index 62af64b9f..90ca02d05 100644 --- a/src/org/linphone/core/video/AndroidCameraRecord5.java +++ b/src/org/linphone/core/video/AndroidCameraRecord5.java @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core.video; +import java.util.Arrays; import java.util.List; import org.linphone.core.video.AndroidCameraRecord.RecorderParams.MirrorType; @@ -43,6 +44,7 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac private final double expectedTimeBetweenFrames; protected final int rotation; private MirrorType mirror; +// private boolean isUsingFrontCamera; public AndroidCameraRecord5(RecorderParams parameters) { super(parameters); @@ -50,6 +52,7 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac filterCtxPtr = parameters.filterDataNativePtr; rotation = parameters.rotation; mirror = parameters.mirror; +// isUsingFrontCamera = parameters.isFrontCamera; storePreviewCallBack(this); } @@ -94,31 +97,34 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac putImage(filterCtxPtr, data, rotation, mirror.ordinal()); } + protected String selectFocusMode(final List supportedFocusModes) {/* + if (isUsingFrontCamera && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED)) { + return Camera.Parameters.FOCUS_MODE_FIXED; + } + if (!isUsingFrontCamera && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY)) { + return Camera.Parameters.FOCUS_MODE_INFINITY; + }*/ + + if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { + return Camera.Parameters.FOCUS_MODE_AUTO; + } + + return null; // Should not occur? + } + @Override protected void onSettingCameraParameters(Parameters parameters) { super.onSettingCameraParameters(parameters); - - if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)) { - Log.w(tag, "Auto Focus supported by camera device"); - parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); + List supportedFocusModes = parameters.getSupportedFocusModes(); + String focusMode = selectFocusMode(supportedFocusModes); + if (focusMode != null) { + Log.w(tag, "Selected focus mode: " + focusMode); + parameters.setFocusMode(focusMode); } else { - Log.w(tag, "Auto Focus not supported by camera device"); - if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_INFINITY)) { - Log.w(tag, "Infinity Focus supported by camera device"); - parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); - } else { - Log.w(tag, "Infinity Focus not supported by camera device"); - } + Log.i(tag, "No suitable focus mode found in : " + Arrays.toString(supportedFocusModes.toArray())); } } - public static List oneShotSupportedVideoSizes() { - Camera camera = Camera.open(); - List supportedVideoSizes =camera.getParameters().getSupportedPreviewSizes(); - camera.release(); - return supportedVideoSizes; - } - @Override protected List getSupportedPreviewSizes(Parameters parameters) { return parameters.getSupportedPreviewSizes(); diff --git a/src/org/linphone/core/video/AndroidCameraRecord8.java b/src/org/linphone/core/video/AndroidCameraRecord8.java index b62c63e97..ad776475b 100644 --- a/src/org/linphone/core/video/AndroidCameraRecord8.java +++ b/src/org/linphone/core/video/AndroidCameraRecord8.java @@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core.video; +import java.util.List; + import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.hardware.Camera.PreviewCallback; @@ -68,4 +70,12 @@ class AndroidCameraRecord8 extends AndroidCameraRecord5 { // Only on v8 hardware camera.setDisplayOrientation(rotation); } + + @Override + protected String selectFocusMode(final List supportedFocusModes) { + if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF)) { + return Camera.Parameters.FOCUS_MODE_EDOF; + } else + return super.selectFocusMode(supportedFocusModes); + } } diff --git a/src/org/linphone/core/video/AndroidCameraRecord9.java b/src/org/linphone/core/video/AndroidCameraRecord9.java index d81e8103e..f0023ef57 100644 --- a/src/org/linphone/core/video/AndroidCameraRecord9.java +++ b/src/org/linphone/core/video/AndroidCameraRecord9.java @@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core.video; +import java.util.List; + import android.hardware.Camera; /** @@ -37,4 +39,12 @@ class AndroidCameraRecord9 extends AndroidCameraRecord8 { protected Camera openCamera(int cameraId) { return Camera.open(cameraId); } + + @Override + protected String selectFocusMode(final List supportedFocusModes) { + if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { + return Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO; + } else + return super.selectFocusMode(supportedFocusModes); + } } diff --git a/src/org/linphone/core/video/AndroidCameraRecordManager.java b/src/org/linphone/core/video/AndroidCameraRecordManager.java index df884583d..a78550a42 100644 --- a/src/org/linphone/core/video/AndroidCameraRecordManager.java +++ b/src/org/linphone/core/video/AndroidCameraRecordManager.java @@ -99,6 +99,7 @@ public class AndroidCameraRecordManager { if (parameters != null) { parameters.cameraId = cameraId; + parameters.isFrontCamera = !previousUseFront; if (isRecording()) { stopVideoRecording(); tryToStartVideoRecording(); @@ -117,9 +118,10 @@ public class AndroidCameraRecordManager { p.width = width; p.height = height; p.cameraId = cameraId; + p.isFrontCamera = isUseFrontCamera(); parameters = p; - if (isUseFrontCamera()) { + if (p.isFrontCamera) { if (!isCameraOrientationPortrait()) { // Code for Nexus S: to be tested p.mirror = RecorderParams.MirrorType.CENTRAL; @@ -227,10 +229,6 @@ public class AndroidCameraRecordManager { if (supportedVideoSizes != null) return supportedVideoSizes; } - if (Version.sdkAboveOrEqual(5)) { - supportedVideoSizes = AndroidCameraRecord5.oneShotSupportedVideoSizes(); - } - // eventually null return supportedVideoSizes;