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

View File

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