Capture focus (continuous or click preview for auto focus)

This commit is contained in:
Guillaume Beraudo 2011-06-03 15:40:56 +02:00
parent f139384616
commit 8a195fc793
5 changed files with 72 additions and 26 deletions

View file

@ -25,6 +25,7 @@ import java.util.List;
import org.linphone.core.Version; import org.linphone.core.Version;
import android.hardware.Camera; import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.ErrorCallback; import android.hardware.Camera.ErrorCallback;
import android.hardware.Camera.Parameters; import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback; import android.hardware.Camera.PreviewCallback;
@ -32,9 +33,11 @@ import android.hardware.Camera.Size;
import android.util.Log; import android.util.Log;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; 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; protected Camera camera;
private RecorderParams params; private RecorderParams params;
@ -125,6 +128,19 @@ public abstract class AndroidCameraRecord {
previewStarted = true; 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 // Register callback to get capture buffer
lowLevelSetPreviewCallback(camera, storedPreviewCallback); lowLevelSetPreviewCallback(camera, storedPreviewCallback);
@ -151,7 +167,7 @@ public abstract class AndroidCameraRecord {
public void storePreviewCallBack(PreviewCallback cb) { public void storePreviewCallBack(PreviewCallback cb) {
this.storedPreviewCallback = cb; this.storedPreviewCallback = cb;
if (camera == null) { if (camera == null) {
Log.w(tag, "Capture camera not ready, storing callback"); Log.w(tag, "Capture camera not ready, storing preview callback");
return; return;
} }
@ -165,6 +181,7 @@ public abstract class AndroidCameraRecord {
camera.stopPreview(); camera.stopPreview();
camera.release(); camera.release();
camera=null; camera=null;
Log.d(tag, "Camera released");
currentPreviewSize = null; currentPreviewSize = null;
previewStarted = false; previewStarted = false;
} }
@ -189,6 +206,7 @@ public abstract class AndroidCameraRecord {
final long filterDataNativePtr; final long filterDataNativePtr;
public int cameraId; public int cameraId;
public boolean isFrontCamera;
public int rotation; public int rotation;
public SurfaceView surfaceView; public SurfaceView surfaceView;
@ -216,4 +234,8 @@ public abstract class AndroidCameraRecord {
return currentPreviewSize.width * currentPreviewSize.height * 3 /2; 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");
}
} }

View file

@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
package org.linphone.core.video; package org.linphone.core.video;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.linphone.core.video.AndroidCameraRecord.RecorderParams.MirrorType; import org.linphone.core.video.AndroidCameraRecord.RecorderParams.MirrorType;
@ -43,6 +44,7 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac
private final double expectedTimeBetweenFrames; private final double expectedTimeBetweenFrames;
protected final int rotation; protected final int rotation;
private MirrorType mirror; private MirrorType mirror;
// private boolean isUsingFrontCamera;
public AndroidCameraRecord5(RecorderParams parameters) { public AndroidCameraRecord5(RecorderParams parameters) {
super(parameters); super(parameters);
@ -50,6 +52,7 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac
filterCtxPtr = parameters.filterDataNativePtr; filterCtxPtr = parameters.filterDataNativePtr;
rotation = parameters.rotation; rotation = parameters.rotation;
mirror = parameters.mirror; mirror = parameters.mirror;
// isUsingFrontCamera = parameters.isFrontCamera;
storePreviewCallBack(this); storePreviewCallBack(this);
} }
@ -94,30 +97,33 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac
putImage(filterCtxPtr, data, rotation, mirror.ordinal()); putImage(filterCtxPtr, data, rotation, mirror.ordinal());
} }
protected String selectFocusMode(final List<String> 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 @Override
protected void onSettingCameraParameters(Parameters parameters) { protected void onSettingCameraParameters(Parameters parameters) {
super.onSettingCameraParameters(parameters); super.onSettingCameraParameters(parameters);
List<String> supportedFocusModes = parameters.getSupportedFocusModes();
if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)) { String focusMode = selectFocusMode(supportedFocusModes);
Log.w(tag, "Auto Focus supported by camera device"); if (focusMode != null) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); Log.w(tag, "Selected focus mode: " + focusMode);
parameters.setFocusMode(focusMode);
} else { } else {
Log.w(tag, "Auto Focus not supported by camera device"); Log.i(tag, "No suitable focus mode found in : " + Arrays.toString(supportedFocusModes.toArray()));
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");
} }
} }
}
public static List<Size> oneShotSupportedVideoSizes() {
Camera camera = Camera.open();
List<Size> supportedVideoSizes =camera.getParameters().getSupportedPreviewSizes();
camera.release();
return supportedVideoSizes;
}
@Override @Override
protected List<Size> getSupportedPreviewSizes(Parameters parameters) { protected List<Size> getSupportedPreviewSizes(Parameters parameters) {

View file

@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
package org.linphone.core.video; package org.linphone.core.video;
import java.util.List;
import android.hardware.Camera; import android.hardware.Camera;
import android.hardware.Camera.Parameters; import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback; import android.hardware.Camera.PreviewCallback;
@ -68,4 +70,12 @@ class AndroidCameraRecord8 extends AndroidCameraRecord5 {
// Only on v8 hardware // Only on v8 hardware
camera.setDisplayOrientation(rotation); camera.setDisplayOrientation(rotation);
} }
@Override
protected String selectFocusMode(final List<String> supportedFocusModes) {
if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF)) {
return Camera.Parameters.FOCUS_MODE_EDOF;
} else
return super.selectFocusMode(supportedFocusModes);
}
} }

View file

@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
package org.linphone.core.video; package org.linphone.core.video;
import java.util.List;
import android.hardware.Camera; import android.hardware.Camera;
/** /**
@ -37,4 +39,12 @@ class AndroidCameraRecord9 extends AndroidCameraRecord8 {
protected Camera openCamera(int cameraId) { protected Camera openCamera(int cameraId) {
return Camera.open(cameraId); return Camera.open(cameraId);
} }
@Override
protected String selectFocusMode(final List<String> supportedFocusModes) {
if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
return Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
} else
return super.selectFocusMode(supportedFocusModes);
}
} }

View file

@ -99,6 +99,7 @@ public class AndroidCameraRecordManager {
if (parameters != null) { if (parameters != null) {
parameters.cameraId = cameraId; parameters.cameraId = cameraId;
parameters.isFrontCamera = !previousUseFront;
if (isRecording()) { if (isRecording()) {
stopVideoRecording(); stopVideoRecording();
tryToStartVideoRecording(); tryToStartVideoRecording();
@ -117,9 +118,10 @@ public class AndroidCameraRecordManager {
p.width = width; p.width = width;
p.height = height; p.height = height;
p.cameraId = cameraId; p.cameraId = cameraId;
p.isFrontCamera = isUseFrontCamera();
parameters = p; parameters = p;
if (isUseFrontCamera()) { if (p.isFrontCamera) {
if (!isCameraOrientationPortrait()) { if (!isCameraOrientationPortrait()) {
// Code for Nexus S: to be tested // Code for Nexus S: to be tested
p.mirror = RecorderParams.MirrorType.CENTRAL; p.mirror = RecorderParams.MirrorType.CENTRAL;
@ -227,10 +229,6 @@ public class AndroidCameraRecordManager {
if (supportedVideoSizes != null) return supportedVideoSizes; if (supportedVideoSizes != null) return supportedVideoSizes;
} }
if (Version.sdkAboveOrEqual(5)) {
supportedVideoSizes = AndroidCameraRecord5.oneShotSupportedVideoSizes();
}
// eventually null // eventually null
return supportedVideoSizes; return supportedVideoSizes;