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:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user