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. 22
      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); Boolean aeLock = result.get(CaptureResult.CONTROL_AE_LOCK);
Integer aeTriggerState = result.get(CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER); Integer aeTriggerState = result.get(CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER);
Integer afTriggerState = result.get(CaptureResult.CONTROL_AF_TRIGGER); Integer afTriggerState = result.get(CaptureResult.CONTROL_AF_TRIGGER);
LOG.v("metering:", String log = "metering: aeMode: " + aeMode + " aeLock: " + aeLock +
"aeMode:", aeMode, "aeLock:", aeLock, " aeState: " + aeState + " aeTriggerState: " + aeTriggerState +
"aeState:", aeState, "aeTriggerState:", aeTriggerState, " afState: " + afState + " afTriggerState: " + afTriggerState;
"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 //endregion
//region Protected APIs //region Protected APIs

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

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

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

@ -8,8 +8,6 @@ import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import java.util.List;
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public abstract class Parameter { public abstract class Parameter {
@ -17,11 +15,8 @@ public abstract class Parameter {
void onLockingChange(); void onLockingChange();
} }
protected boolean isSuccessful; private boolean isSuccessful;
private boolean isLocked;
@SuppressWarnings("WeakerAccess")
protected boolean isLocked;
private LockingChangeCallback callback; private LockingChangeCallback callback;
private boolean shouldSkip; private boolean shouldSkip;
private boolean supportsLocking; private boolean supportsLocking;
@ -44,6 +39,12 @@ public abstract class Parameter {
callback.onLockingChange(); callback.onLockingChange();
} }
@SuppressWarnings({"WeakerAccess", "SameParameterValue"})
protected void notifyLocked(boolean success) {
isLocked = true;
isSuccessful = success;
}
public final boolean isLocked() { public final boolean isLocked() {
// A non supported parameter should always appear as metered // A non supported parameter should always appear as metered
return isLocked || !supportsLocking || shouldSkip; return isLocked || !supportsLocking || shouldSkip;
@ -70,7 +71,7 @@ public abstract class Parameter {
@NonNull CaptureResult result) { @NonNull CaptureResult result) {
if (isLocked()) return; if (isLocked()) return;
processCapture(result); processCapture(result);
if (isLocked()) onLocked(builder); if (isLocked()) onLocked(builder, isSuccessful);
} }
protected abstract boolean checkSupportsLocking(@NonNull CameraCharacteristics characteristics, 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 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. // distinguish, check the trigger state.
if (aeTriggerState != null if (aeTriggerState != null
&& aeTriggerState == CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER_START) { && aeTriggerState == CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER_START) {
isMetered = true; notifyMetered(true);
isSuccessful = true;
} }
break; break;
} }
case CaptureResult.CONTROL_AE_STATE_LOCKED: { case CaptureResult.CONTROL_AE_STATE_LOCKED: {
// There's nothing we can do, AE was locked, triggers are ignored. // There's nothing we can do, AE was locked, triggers are ignored.
isMetered = true; notifyMetered(false);
isSuccessful = false;
break; break;
} }
case CaptureResult.CONTROL_AE_STATE_INACTIVE: case CaptureResult.CONTROL_AE_STATE_INACTIVE:
@ -129,14 +127,12 @@ public class AutoExposure extends Parameter {
switch (aeState) { switch (aeState) {
case CaptureResult.CONTROL_AE_STATE_CONVERGED: case CaptureResult.CONTROL_AE_STATE_CONVERGED:
case CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED: { case CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED: {
isMetered = true; notifyMetered(true);
isSuccessful = true;
break; break;
} }
case CaptureResult.CONTROL_AE_STATE_LOCKED: { case CaptureResult.CONTROL_AE_STATE_LOCKED: {
// There's nothing we can do, AE was locked, triggers are ignored. // There's nothing we can do, AE was locked, triggers are ignored.
isMetered = true; notifyMetered(false);
isSuccessful = false;
break; break;
} }
case CaptureResult.CONTROL_AE_STATE_PRECAPTURE: case CaptureResult.CONTROL_AE_STATE_PRECAPTURE:
@ -150,7 +146,7 @@ public class AutoExposure extends Parameter {
} }
@Override @Override
protected void onMetered(@NonNull CaptureRequest.Builder builder) { protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) {
// Do nothing // Do nothing
} }

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

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

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

Loading…
Cancel
Save