Small changes to locking and metering

pull/580/head
Mattia Iavarone 6 years ago
parent 40180462ab
commit daaf664e66
  1. 33
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  2. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoExposure.java
  3. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoFocus.java
  4. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoWhiteBalance.java
  5. 19
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/Parameter.java
  6. 14
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoExposure.java
  7. 8
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoFocus.java
  8. 8
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoWhiteBalance.java
  9. 24
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/Parameter.java

@ -266,10 +266,32 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
Boolean aeLock = result.get(CaptureResult.CONTROL_AE_LOCK);
Integer aeTriggerState = result.get(CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER);
Integer afTriggerState = result.get(CaptureResult.CONTROL_AF_TRIGGER);
LOG.v("metering:",
"aeMode:", aeMode, "aeLock:", aeLock,
"aeState:", aeState, "aeTriggerState:", aeTriggerState,
"afState:", afState, "afTriggerState:", afTriggerState);
String log = "metering: aeMode: " + aeMode + " aeLock: " + aeLock +
" aeState: " + aeState + " aeTriggerState: " + aeTriggerState +
" afState: " + afState + " afTriggerState: " + afTriggerState;
if (!log.equals(mLastLog)) {
mLastLog = log;
LOG.w(log);
}
// DURING metering (focus skips)
// aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 0 afState: 0 afTriggerState: 0
// aeMode: 3 aeLock: false aeState: 5 aeTriggerState: 1 afState: 0 afTriggerState: 0
//
// DURING locking (focus skips)
// aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 1 afState: 0 afTriggerState: 0
// aeMode: 3 aeLock: true aeState: 5 aeTriggerState: 1 afState: 0 afTriggerState: 0
//
// AFTER locked
// aeMode: 3 aeLock: true aeState: 3 aeTriggerState: 1 afState: 0 afTriggerState: 0
//
// AFTER super.take() called
// aeMode: 1 aeLock: true aeState: 5 aeTriggerState: 1 afState: 0 afTriggerState: 0
// aeMode: 1 aeLock: true aeState: 3 aeTriggerState: 1 afState: 0 afTriggerState: 0
//
// Reverting flash changes + reset lock + reset metering
// aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 2 afState: 2 afTriggerState: 0
// aeMode: 3 aeLock: false aeState: 1 aeTriggerState: 2 afState: 2 afTriggerState: 0
}
};
@ -279,6 +301,9 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
}
}
}
private String mLastLog;
//endregion
//region Protected APIs

@ -62,8 +62,7 @@ public class AutoExposure extends Parameter {
if (aeState == null) return;
switch (aeState) {
case CaptureRequest.CONTROL_AE_STATE_LOCKED: {
isLocked = true;
isSuccessful = true;
notifyLocked(true);
break;
}
case CaptureRequest.CONTROL_AE_STATE_PRECAPTURE:
@ -78,7 +77,7 @@ public class AutoExposure extends Parameter {
}
@Override
protected void onLocked(@NonNull CaptureRequest.Builder builder) {
protected void onLocked(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing
}
}

@ -72,8 +72,7 @@ public class AutoFocus extends Parameter {
case CaptureRequest.CONTROL_AF_STATE_INACTIVE:
case CaptureRequest.CONTROL_AF_STATE_PASSIVE_FOCUSED:
case CaptureRequest.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: {
isLocked = true;
isSuccessful = true;
notifyLocked(true);
break;
}
case CaptureRequest.CONTROL_AF_STATE_ACTIVE_SCAN:
@ -85,7 +84,7 @@ public class AutoFocus extends Parameter {
}
@Override
protected void onLocked(@NonNull CaptureRequest.Builder builder) {
protected void onLocked(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing.
}

@ -54,8 +54,7 @@ public class AutoWhiteBalance extends Parameter {
if (awbState == null) return;
switch (awbState) {
case CaptureRequest.CONTROL_AWB_STATE_LOCKED: {
isLocked = true;
isSuccessful = true;
notifyLocked(true);
break;
}
case CaptureRequest.CONTROL_AWB_STATE_CONVERGED:
@ -68,7 +67,7 @@ public class AutoWhiteBalance extends Parameter {
}
@Override
protected void onLocked(@NonNull CaptureRequest.Builder builder) {
protected void onLocked(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing
}
}

@ -8,8 +8,6 @@ import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import java.util.List;
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public abstract class Parameter {
@ -17,11 +15,8 @@ public abstract class Parameter {
void onLockingChange();
}
protected boolean isSuccessful;
@SuppressWarnings("WeakerAccess")
protected boolean isLocked;
private boolean isSuccessful;
private boolean isLocked;
private LockingChangeCallback callback;
private boolean shouldSkip;
private boolean supportsLocking;
@ -44,6 +39,12 @@ public abstract class Parameter {
callback.onLockingChange();
}
@SuppressWarnings({"WeakerAccess", "SameParameterValue"})
protected void notifyLocked(boolean success) {
isLocked = true;
isSuccessful = success;
}
public final boolean isLocked() {
// A non supported parameter should always appear as metered
return isLocked || !supportsLocking || shouldSkip;
@ -70,7 +71,7 @@ public abstract class Parameter {
@NonNull CaptureResult result) {
if (isLocked()) return;
processCapture(result);
if (isLocked()) onLocked(builder);
if (isLocked()) onLocked(builder, isSuccessful);
}
protected abstract boolean checkSupportsLocking(@NonNull CameraCharacteristics characteristics,
@ -83,5 +84,5 @@ public abstract class Parameter {
protected abstract void processCapture(@NonNull CaptureResult result);
protected abstract void onLocked(@NonNull CaptureRequest.Builder builder);
protected abstract void onLocked(@NonNull CaptureRequest.Builder builder, boolean success);
}

@ -108,15 +108,13 @@ public class AutoExposure extends Parameter {
// distinguish, check the trigger state.
if (aeTriggerState != null
&& aeTriggerState == CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER_START) {
isMetered = true;
isSuccessful = true;
notifyMetered(true);
}
break;
}
case CaptureResult.CONTROL_AE_STATE_LOCKED: {
// There's nothing we can do, AE was locked, triggers are ignored.
isMetered = true;
isSuccessful = false;
notifyMetered(false);
break;
}
case CaptureResult.CONTROL_AE_STATE_INACTIVE:
@ -129,14 +127,12 @@ public class AutoExposure extends Parameter {
switch (aeState) {
case CaptureResult.CONTROL_AE_STATE_CONVERGED:
case CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED: {
isMetered = true;
isSuccessful = true;
notifyMetered(true);
break;
}
case CaptureResult.CONTROL_AE_STATE_LOCKED: {
// There's nothing we can do, AE was locked, triggers are ignored.
isMetered = true;
isSuccessful = false;
notifyMetered(false);
break;
}
case CaptureResult.CONTROL_AE_STATE_PRECAPTURE:
@ -150,7 +146,7 @@ public class AutoExposure extends Parameter {
}
@Override
protected void onMetered(@NonNull CaptureRequest.Builder builder) {
protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing
}

@ -84,13 +84,11 @@ public class AutoFocus extends Parameter {
if (afState == null) return;
switch (afState) {
case CaptureRequest.CONTROL_AF_STATE_FOCUSED_LOCKED: {
isMetered = true;
isSuccessful = true;
notifyMetered(true);
break;
}
case CaptureRequest.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: {
isMetered = true;
isSuccessful = false;
notifyMetered(false);
break;
}
case CaptureRequest.CONTROL_AF_STATE_INACTIVE: break;
@ -100,7 +98,7 @@ public class AutoFocus extends Parameter {
}
@Override
protected void onMetered(@NonNull CaptureRequest.Builder builder) {
protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing.
}

@ -67,14 +67,12 @@ public class AutoWhiteBalance extends Parameter {
switch (awbState) {
case CaptureRequest.CONTROL_AWB_STATE_CONVERGED: {
isMetered = true;
isSuccessful = true;
notifyMetered(true);
break;
}
case CaptureRequest.CONTROL_AWB_STATE_LOCKED: {
// Nothing we can do if AWB was locked.
isMetered = true;
isSuccessful = false;
notifyMetered(false);
break;
}
case CaptureRequest.CONTROL_AWB_STATE_INACTIVE:
@ -86,7 +84,7 @@ public class AutoWhiteBalance extends Parameter {
}
@Override
protected void onMetered(@NonNull CaptureRequest.Builder builder) {
protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing
}

@ -19,17 +19,12 @@ public abstract class Parameter {
void onMeteringChange();
}
@SuppressWarnings("WeakerAccess")
protected boolean isSuccessful;
@SuppressWarnings("WeakerAccess")
protected boolean isMetered;
private boolean isSuccessful;
private boolean isMetered;
private MeteringChangeCallback callback;
private boolean shouldSkip;
private boolean supportsProcessing;
@SuppressWarnings("WeakerAccess")
protected Parameter(@NonNull MeteringChangeCallback callback) {
this.callback = callback;
}
@ -48,6 +43,12 @@ public abstract class Parameter {
callback.onMeteringChange();
}
@SuppressWarnings("WeakerAccess")
protected void notifyMetered(boolean success) {
isMetered = true;
isSuccessful = success;
}
public final boolean isMetered() {
// A non supported parameter should always appear as metered
return isMetered || !supportsProcessing || shouldSkip;
@ -74,9 +75,10 @@ public abstract class Parameter {
public final void onCapture(@NonNull CaptureRequest.Builder builder,
@NonNull CaptureResult result) {
if (isMetered()) return;
processCapture(result);
if (isMetered()) onMetered(builder);
if (!isMetered()) {
processCapture(result);
if (isMetered()) onMetered(builder, isSuccessful);
}
}
public final void resetMetering(@NonNull CameraCharacteristics characteristics,
@ -97,7 +99,7 @@ public abstract class Parameter {
protected abstract void processCapture(@NonNull CaptureResult result);
protected abstract void onMetered(@NonNull CaptureRequest.Builder builder);
protected abstract void onMetered(@NonNull CaptureRequest.Builder builder, boolean success);
protected abstract void onResetMetering(@NonNull CameraCharacteristics characteristics,
@NonNull CaptureRequest.Builder builder,

Loading…
Cancel
Save