Small changes

pull/580/head
Mattia Iavarone 6 years ago
parent ecf18e31dc
commit e31c3179b5
  1. 6
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  2. 24
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Meter.java
  3. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoExposure.java
  4. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoFocus.java
  5. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoWhiteBalance.java
  6. 28
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/Parameter.java

@ -53,7 +53,6 @@ import com.otaliastudios.cameraview.internal.utils.ImageHelper;
import com.otaliastudios.cameraview.internal.utils.WorkerHandler;
import com.otaliastudios.cameraview.picture.Full2PictureRecorder;
import com.otaliastudios.cameraview.picture.Snapshot2PictureRecorder;
import com.otaliastudios.cameraview.picture.SnapshotGlPictureRecorder;
import com.otaliastudios.cameraview.preview.GlCameraPreview;
import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size;
@ -813,7 +812,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
if (oldBuilder != null) {
// We might be in a metering operation, or the old builder might have some special
// metering parameters. Copy these special keys over to the new builder.
// These are the keys changed by MeteringParameters, or by us in applyFocusForMetering.
// These are the keys changed by metering.Parameters, or by us in applyFocusForMetering.
builder.set(CaptureRequest.CONTROL_AF_REGIONS, oldBuilder.get(CaptureRequest.CONTROL_AF_REGIONS));
builder.set(CaptureRequest.CONTROL_AE_REGIONS, oldBuilder.get(CaptureRequest.CONTROL_AE_REGIONS));
builder.set(CaptureRequest.CONTROL_AWB_REGIONS, oldBuilder.get(CaptureRequest.CONTROL_AWB_REGIONS));
@ -1225,7 +1224,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
mMeter = new Meter(Camera2Engine.this,
mCameraCharacteristics,
Camera2Engine.this);
mMeter.startMetering(mLastRepeatingResult, point);
mMeter.startMetering(mLastRepeatingResult, point, point == null);
}
});
}
@ -1234,7 +1233,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
* Called by {@link Meter} when the metering process has started.
* We are currently exposing an auto focus API so that's what we dispatch.
* @param point point
*
*/
@Override
public void onMeteringStarted(@Nullable PointF point) {

@ -17,7 +17,7 @@ import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.engine.metering.AutoExposure;
import com.otaliastudios.cameraview.engine.metering.AutoFocus;
import com.otaliastudios.cameraview.engine.metering.AutoWhiteBalance;
import com.otaliastudios.cameraview.engine.metering.MeteringParameter;
import com.otaliastudios.cameraview.engine.metering.Parameter;
import com.otaliastudios.cameraview.engine.offset.Axis;
import com.otaliastudios.cameraview.engine.offset.Reference;
import com.otaliastudios.cameraview.size.AspectRatio;
@ -30,7 +30,7 @@ import java.util.List;
* Helps Camera2-based engines to perform 3A (auto focus, auto exposure and auto white balance)
* metering. Users are required to:
*
* - Call {@link #startMetering(CaptureResult, PointF)} to start
* - Call {@link #startMetering(CaptureResult, PointF, boolean)} to start
* - Call {@link #onCapture(CaptureResult)} when they have partial or total results, as long as the
* meter is still in a metering operation, which can be checked through {@link #isMetering()}
* - Call {@link #resetMetering()} to reset the metering parameters if needed. This is done automatically
@ -65,7 +65,7 @@ public class Meter {
/**
* Notifies that metering has been reset. From now on, this meter instance
* is done, although in theory it could be reused by calling
* {@link #startMetering(CaptureResult, PointF)} again.
* {@link #startMetering(CaptureResult, PointF, boolean)} again.
* @param point point
*
*/
@ -93,9 +93,9 @@ public class Meter {
private boolean mIsMetering;
private long mMeteringStartTime;
private MeteringParameter mAutoFocus = new AutoFocus();
private MeteringParameter mAutoWhiteBalance = new AutoWhiteBalance();
private MeteringParameter mAutoExposure = new AutoExposure();
private Parameter mAutoFocus = new AutoFocus();
private Parameter mAutoWhiteBalance = new AutoWhiteBalance();
private Parameter mAutoExposure = new AutoExposure();
/**
* Creates a new meter.
@ -116,9 +116,12 @@ public class Meter {
* Starts a metering sequence.
* @param lastResult the last result
* @param point point
* @param skipIfPossible try skip
*/
@SuppressWarnings("WeakerAccess")
public void startMetering(@NonNull CaptureResult lastResult, @Nullable PointF point) {
public void startMetering(@NonNull CaptureResult lastResult,
@Nullable PointF point,
boolean skipIfPossible) {
mPoint = point;
mIsMetering = true;
@ -163,7 +166,6 @@ public class Meter {
}
// 7. And finally dispatch everything
boolean skipIfPossible = mPoint == null;
mAutoFocus.startMetering(mCharacteristics, mCallback.getMeteringBuilder(), areas, lastResult, skipIfPossible);
mAutoWhiteBalance.startMetering(mCharacteristics, mCallback.getMeteringBuilder(), areas, lastResult, skipIfPossible);
mAutoExposure.startMetering(mCharacteristics, mCallback.getMeteringBuilder(), areas, lastResult, skipIfPossible);
@ -309,7 +311,7 @@ public class Meter {
/**
* True if we're metering. False if we're not, for example if we're waiting for
* a reset call, or if {@link #startMetering(CaptureResult, PointF)} was never called.
* a reset call, or if {@link #startMetering(CaptureResult, PointF, boolean)} was never called.
* @return true if metering
*/
public boolean isMetering() {
@ -330,13 +332,13 @@ public class Meter {
if (!mAutoExposure.isMetered()) mAutoExposure.onCapture(mCallback.getMeteringBuilder(), result);
if (!mAutoWhiteBalance.isMetered()) mAutoWhiteBalance.onCapture(mCallback.getMeteringBuilder(), result);
if (mAutoFocus.isMetered() && mAutoExposure.isMetered() && mAutoWhiteBalance.isMetered()) {
LOG.i("onCapture:", "all MeteringParameters have converged. Dispatching onMeteringEnd");
LOG.i("onCapture:", "all Parameters have converged. Dispatching onMeteringEnd");
boolean success = mAutoFocus.isSuccessful()
&& mAutoExposure.isSuccessful()
&& mAutoWhiteBalance.isSuccessful();
onMeteringEnd(success);
} else if (System.currentTimeMillis() - mMeteringStartTime >= FORCED_END_DELAY) {
LOG.i("onCapture:", "FORCED_END_DELAY was reached. Some MeteringParameter is stuck. Forcing end.");
LOG.i("onCapture:", "FORCED_END_DELAY was reached. Some Parameter is stuck. Forcing end.");
onMeteringEnd(false);
}
}

@ -15,7 +15,7 @@ import com.otaliastudios.cameraview.CameraLogger;
import java.util.List;
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public class AutoExposure extends MeteringParameter {
public class AutoExposure extends Parameter {
private static final String TAG = AutoExposure.class.getSimpleName();
private static final CameraLogger LOG = CameraLogger.create(TAG);

@ -15,7 +15,7 @@ import com.otaliastudios.cameraview.CameraLogger;
import java.util.List;
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public class AutoFocus extends MeteringParameter {
public class AutoFocus extends Parameter {
private static final String TAG = AutoFocus.class.getSimpleName();
private static final CameraLogger LOG = CameraLogger.create(TAG);

@ -15,7 +15,7 @@ import com.otaliastudios.cameraview.CameraLogger;
import java.util.List;
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public class AutoWhiteBalance extends MeteringParameter {
public class AutoWhiteBalance extends Parameter {
private static final String TAG = AutoWhiteBalance.class.getSimpleName();
private static final CameraLogger LOG = CameraLogger.create(TAG);

@ -13,7 +13,7 @@ import androidx.annotation.RequiresApi;
import java.util.List;
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public abstract class MeteringParameter {
public abstract class Parameter {
@SuppressWarnings("WeakerAccess")
protected boolean isSuccessful;
@ -57,6 +57,19 @@ public abstract class MeteringParameter {
}
}
public final void onCapture(@NonNull CaptureRequest.Builder builder,
@NonNull CaptureResult result) {
if (isMetered()) return;
processCapture(result);
if (isMetered()) onMetered(builder);
}
public final void resetMetering(@NonNull CameraCharacteristics characteristics,
@NonNull CaptureRequest.Builder builder,
@Nullable MeteringRectangle area) {
onResetMetering(characteristics, builder, area, supportsProcessing);
}
protected abstract boolean checkSupportsProcessing(@NonNull CameraCharacteristics characteristics,
@NonNull CaptureRequest.Builder builder);
@ -67,23 +80,10 @@ public abstract class MeteringParameter {
@NonNull List<MeteringRectangle> areas,
boolean supportsProcessing);
public final void onCapture(@NonNull CaptureRequest.Builder builder,
@NonNull CaptureResult result) {
if (isMetered()) return;
processCapture(result);
if (isMetered()) onMetered(builder);
}
protected abstract void processCapture(@NonNull CaptureResult result);
protected abstract void onMetered(@NonNull CaptureRequest.Builder builder);
public final void resetMetering(@NonNull CameraCharacteristics characteristics,
@NonNull CaptureRequest.Builder builder,
@Nullable MeteringRectangle area) {
onResetMetering(characteristics, builder, area, supportsProcessing);
}
protected abstract void onResetMetering(@NonNull CameraCharacteristics characteristics,
@NonNull CaptureRequest.Builder builder,
@Nullable MeteringRectangle area,
Loading…
Cancel
Save