Capture focus (continuous or click preview for auto focus)
This commit is contained in:
parent
f139384616
commit
8a195fc793
5 changed files with 72 additions and 26 deletions
|
@ -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;
|
||||||
|
|
||||||
|
@ -215,5 +233,9 @@ 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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,31 +97,34 @@ 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) {
|
||||||
return parameters.getSupportedPreviewSizes();
|
return parameters.getSupportedPreviewSizes();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue