am cfd8132a: Merge "EmulatedFakeCamera2: Split AE/AWB mode and lock" into jb-mr1-dev

* commit 'cfd8132af00e517a5442a5a077354dac40b1aa21':
  EmulatedFakeCamera2: Split AE/AWB mode and lock
This commit is contained in:
Eino-Ville Talvala
2012-09-07 13:42:17 -07:00
committed by Android Git Automerger
2 changed files with 33 additions and 15 deletions

View File

@@ -1573,6 +1573,15 @@ status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *r
&mode);
mAeMode = mode.data.u8[0];
res = find_camera_metadata_entry(request,
ANDROID_CONTROL_AE_LOCK,
&mode);
bool aeLock = (mode.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON);
if (mAeLock && !aeLock) {
mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
}
mAeLock = aeLock;
res = find_camera_metadata_entry(request,
ANDROID_CONTROL_AWB_MODE,
&mode);
@@ -1636,7 +1645,7 @@ const float EmulatedFakeCamera2::ControlThread::kAeScanStartRate =
kControlCycleDelay / 3000000000.0;
const nsecs_t EmulatedFakeCamera2::ControlThread::kNormalExposureTime = 10 * MSEC;
const nsecs_t EmulatedFakeCamera2::ControlThread::kExposureJump = 5 * MSEC;
const nsecs_t EmulatedFakeCamera2::ControlThread::kExposureJump = 2 * MSEC;
const nsecs_t EmulatedFakeCamera2::ControlThread::kMinExposureTime = 1 * MSEC;
bool EmulatedFakeCamera2::ControlThread::threadLoop() {
@@ -1649,6 +1658,7 @@ bool EmulatedFakeCamera2::ControlThread::threadLoop() {
bool precaptureTriggered = false;
uint8_t aeState;
uint8_t aeMode;
bool aeLock;
int32_t precaptureTriggerId;
nsecs_t nextSleep = kControlCycleDelay;
@@ -1677,6 +1687,7 @@ bool EmulatedFakeCamera2::ControlThread::threadLoop() {
}
aeState = mAeState;
aeMode = mAeMode;
aeLock = mAeLock;
precaptureTriggerId = mPrecaptureTriggerId;
}
@@ -1695,19 +1706,15 @@ bool EmulatedFakeCamera2::ControlThread::threadLoop() {
}
afState = maybeStartAfScan(afMode, afState);
afState = updateAfScan(afMode, afState, &nextSleep);
updateAfState(afState, afTriggerId);
if (precaptureTriggered) {
aeState = processPrecaptureTrigger(aeMode, aeState);
}
aeState = maybeStartAeScan(aeMode, aeState);
aeState = updateAeScan(aeMode, aeState, &nextSleep);
aeState = maybeStartAeScan(aeMode, aeLock, aeState);
aeState = updateAeScan(aeMode, aeLock, aeState, &nextSleep);
updateAeState(aeState, precaptureTriggerId);
int ret;
@@ -1880,7 +1887,6 @@ int EmulatedFakeCamera2::ControlThread::processPrecaptureTrigger(uint8_t aeMode,
uint8_t aeState) {
switch (aeMode) {
case ANDROID_CONTROL_AE_OFF:
case ANDROID_CONTROL_AE_LOCKED:
// Don't do anything for these
return aeState;
case ANDROID_CONTROL_AE_ON:
@@ -1900,11 +1906,11 @@ int EmulatedFakeCamera2::ControlThread::processPrecaptureTrigger(uint8_t aeMode,
}
int EmulatedFakeCamera2::ControlThread::maybeStartAeScan(uint8_t aeMode,
bool aeLocked,
uint8_t aeState) {
if (aeLocked) return aeState;
switch (aeMode) {
case ANDROID_CONTROL_AE_OFF:
case ANDROID_CONTROL_AE_LOCKED:
// Don't do anything for these
break;
case ANDROID_CONTROL_AE_ON:
case ANDROID_CONTROL_AE_ON_AUTO_FLASH:
@@ -1928,12 +1934,16 @@ int EmulatedFakeCamera2::ControlThread::maybeStartAeScan(uint8_t aeMode,
}
int EmulatedFakeCamera2::ControlThread::updateAeScan(uint8_t aeMode,
uint8_t aeState, nsecs_t *maxSleep) {
if ((aeState == ANDROID_CONTROL_AE_STATE_SEARCHING) ||
bool aeLock, uint8_t aeState, nsecs_t *maxSleep) {
if (aeLock && aeState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
mAeScanDuration = 0;
aeState = ANDROID_CONTROL_AE_STATE_LOCKED;
} else if ((aeState == ANDROID_CONTROL_AE_STATE_SEARCHING) ||
(aeState == ANDROID_CONTROL_AE_STATE_PRECAPTURE ) ) {
if (mAeScanDuration <= 0) {
ALOGD("%s: AE scan done", __FUNCTION__);
aeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
aeState = aeLock ?
ANDROID_CONTROL_AE_STATE_LOCKED :ANDROID_CONTROL_AE_STATE_CONVERGED;
Mutex::Autolock lock(mInputMutex);
mExposureTime = kNormalExposureTime;
@@ -2558,6 +2568,9 @@ status_t EmulatedFakeCamera2::constructDefaultRequest(
static const uint8_t aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH;
ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
ADD_OR_SIZE(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
static const int32_t controlRegions[5] = {
0, 0, Sensor::kResolution[0], Sensor::kResolution[1], 1000
};
@@ -2579,6 +2592,9 @@ status_t EmulatedFakeCamera2::constructDefaultRequest(
ANDROID_CONTROL_AWB_AUTO;
ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
ADD_OR_SIZE(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
uint8_t afMode = 0;

View File

@@ -344,6 +344,7 @@ private:
uint8_t mAfState;
uint8_t mAeState;
uint8_t mAwbState;
bool mAeLock;
// Current control parameters
nsecs_t mExposureTime;
@@ -362,8 +363,9 @@ private:
// Utility methods for precapture trigger
int processPrecaptureTrigger(uint8_t aeMode, uint8_t aeState);
int maybeStartAeScan(uint8_t aeMode, uint8_t aeState);
int updateAeScan(uint8_t aeMode, uint8_t aeState, nsecs_t *maxSleep);
int maybeStartAeScan(uint8_t aeMode, bool aeLock, uint8_t aeState);
int updateAeScan(uint8_t aeMode, bool aeLock, uint8_t aeState,
nsecs_t *maxSleep);
void updateAeState(uint8_t newState, int32_t triggerId);
};