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 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;
|
||||
|
||||
|
@ -216,4 +234,8 @@ 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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,30 +97,33 @@ class AndroidCameraRecord5 extends AndroidCameraRecord implements PreviewCallbac
|
|||
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
|
||||
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<String> 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<Size> oneShotSupportedVideoSizes() {
|
||||
Camera camera = Camera.open();
|
||||
List<Size> supportedVideoSizes =camera.getParameters().getSupportedPreviewSizes();
|
||||
camera.release();
|
||||
return supportedVideoSizes;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Size> getSupportedPreviewSizes(Parameters parameters) {
|
||||
|
|
|
@ -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<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;
|
||||
|
||||
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<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) {
|
||||
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;
|
||||
|
|
Loading…
Reference in a new issue