Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65fecee7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Skip gathering complete 3A state"

parents f4a0c67c 7142df6e
Loading
Loading
Loading
Loading
+58 −36
Original line number Diff line number Diff line
@@ -33,7 +33,10 @@ FrameProcessor::FrameProcessor(wp<CameraDeviceBase> device,
    FrameProcessorBase(device),
    mClient(client),
    mLastFrameNumberOfFaces(0),
    mLast3AFrameNumber(-1) {
    mLast3AFrameNumber(-1),
    mLastAEFrameNumber(-1),
    mLastAFrameNumber(-1),
    mLastAWBFrameNumber(-1) {

    sp<CameraDeviceBase> d = device.promote();
    mSynthesize3ANotify = !(d->willNotify3A());
@@ -262,43 +265,39 @@ status_t FrameProcessor::process3aState(const CaptureResult &frame,
    bool gotAllStates = true;

    // TODO: Also use AE mode, AE trigger ID
    gotAllStates &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AF_MODE,
    bool gotAFState = updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AF_MODE,
            &pendingState.afMode, frameNumber, cameraId);

    gotAllStates &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AWB_MODE,
    bool gotAWBState = updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AWB_MODE,
            &pendingState.awbMode, frameNumber, cameraId);

    gotAllStates &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AE_STATE,
    bool gotAEState = updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AE_STATE,
            &pendingState.aeState, frameNumber, cameraId);

    gotAllStates &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AF_STATE,
    gotAFState &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AF_STATE,
            &pendingState.afState, frameNumber, cameraId);

    gotAllStates &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AWB_STATE,
    gotAWBState &= updatePendingState<uint8_t>(metadata, ANDROID_CONTROL_AWB_STATE,
            &pendingState.awbState, frameNumber, cameraId);

    pendingState.afTriggerId = frame.mResultExtras.afTriggerId;
    pendingState.aeTriggerId = frame.mResultExtras.precaptureTriggerId;

    if (!gotAllStates) {
        // If not all states are received, put the pending state to mPending3AStates.
        if (index == NAME_NOT_FOUND) {
            mPending3AStates.add(frameNumber, pendingState);
        } else {
            mPending3AStates.replaceValueAt(index, pendingState);
        }
        return NOT_ENOUGH_DATA;
    }

    // Once all 3A states are received, notify the client about 3A changes.
    if (gotAEState && (frameNumber > mLastAEFrameNumber)) {
        if (pendingState.aeState != m3aState.aeState ||
                pendingState.aeTriggerId > m3aState.aeTriggerId) {
            ALOGV("%s: Camera %d: AE state %d->%d",
                    __FUNCTION__, cameraId,
                    m3aState.aeState, pendingState.aeState);
            client->notifyAutoExposure(pendingState.aeState, pendingState.aeTriggerId);

            m3aState.aeState = pendingState.aeState;
            m3aState.aeTriggerId = pendingState.aeTriggerId;
            mLastAEFrameNumber = frameNumber;
        }
    }

    if (gotAFState && (frameNumber > mLastAFrameNumber)) {
        if (pendingState.afState != m3aState.afState ||
                pendingState.afMode != m3aState.afMode ||
                pendingState.afTriggerId != m3aState.afTriggerId) {
@@ -308,7 +307,15 @@ status_t FrameProcessor::process3aState(const CaptureResult &frame,
                    m3aState.afMode, pendingState.afMode,
                    m3aState.afTriggerId, pendingState.afTriggerId);
            client->notifyAutoFocus(pendingState.afState, pendingState.afTriggerId);

            m3aState.afState = pendingState.afState;
            m3aState.afMode = pendingState.afMode;
            m3aState.afTriggerId = pendingState.afTriggerId;
            mLastAFrameNumber = frameNumber;
        }
    }

    if (gotAWBState && (frameNumber > mLastAWBFrameNumber)) {
        if (pendingState.awbState != m3aState.awbState ||
                pendingState.awbMode != m3aState.awbMode) {
            ALOGV("%s: Camera %d: AWB state %d->%d. AWB mode %d->%d",
@@ -317,13 +324,28 @@ status_t FrameProcessor::process3aState(const CaptureResult &frame,
                    m3aState.awbMode, pendingState.awbMode);
            client->notifyAutoWhitebalance(pendingState.awbState,
                    pendingState.aeTriggerId);

            m3aState.awbMode = pendingState.awbMode;
            m3aState.awbState = pendingState.awbState;
            mLastAWBFrameNumber = frameNumber;
        }
    }

    gotAllStates &= gotAEState & gotAFState & gotAWBState;
    if (!gotAllStates) {
        // If not all states are received, put the pending state to mPending3AStates.
        if (index == NAME_NOT_FOUND) {
            mPending3AStates.add(frameNumber, pendingState);
        } else {
            mPending3AStates.replaceValueAt(index, pendingState);
        }
        return NOT_ENOUGH_DATA;
    }

    if (index != NAME_NOT_FOUND) {
        mPending3AStates.removeItemsAt(index);
    }

    m3aState = pendingState;
    mLast3AFrameNumber = frameNumber;

    return OK;
+1 −2
Original line number Diff line number Diff line
@@ -104,8 +104,7 @@ class FrameProcessor : public FrameProcessorBase {
    // Track most recent frame number for which 3A notifications were sent for.
    // Used to filter against sending 3A notifications for the same frame
    // several times.
    int32_t mLast3AFrameNumber;

    int32_t mLast3AFrameNumber, mLastAEFrameNumber, mLastAFrameNumber, mLastAWBFrameNumber;
    // Emit FaceDetection event to java if faces changed
    void callbackFaceDetection(const sp<Camera2Client>& client,
                               const camera_frame_metadata &metadata);