Merge changes I36c3dcaa,I7574913a,I8db9d918,I37e2c005 into jb-mr1-aah-dev
* changes: Camera2: Fix segfault when control fields were omitted in metadata: DO NOT MERGE Camera2: Test: fix deadlock in isStreamInUse: DO NOT MERGE Camera2: Return -ENODEV for camera indices out of bounds: DO NOT MERGE Camera2: Turn off 3A when android.control.mode == OFF: DO NOT MERGE
This commit is contained in:
committed by
Android (Google) Code Review
commit
ba48d6f00c
@@ -196,7 +196,7 @@ int EmulatedCameraFactory::cameraDeviceOpen(int camera_id, hw_device_t** device)
|
||||
if (camera_id < 0 || camera_id >= getEmulatedCameraNum()) {
|
||||
ALOGE("%s: Camera id %d is out of bounds (%d)",
|
||||
__FUNCTION__, camera_id, getEmulatedCameraNum());
|
||||
return -EINVAL;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return mEmulatedCameras[camera_id]->connectCamera(device);
|
||||
@@ -214,7 +214,7 @@ int EmulatedCameraFactory::getCameraInfo(int camera_id, struct camera_info* info
|
||||
if (camera_id < 0 || camera_id >= getEmulatedCameraNum()) {
|
||||
ALOGE("%s: Camera id %d is out of bounds (%d)",
|
||||
__FUNCTION__, camera_id, getEmulatedCameraNum());
|
||||
return -EINVAL;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return mEmulatedCameras[camera_id]->getCameraInfo(info);
|
||||
|
||||
@@ -1155,6 +1155,8 @@ void EmulatedFakeCamera2::ReadoutThread::setNextOperation(
|
||||
}
|
||||
|
||||
bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
|
||||
// acquire in same order as threadLoop
|
||||
Mutex::Autolock iLock(mInternalsMutex);
|
||||
Mutex::Autolock lock(mInputMutex);
|
||||
|
||||
size_t i = mInFlightHead;
|
||||
@@ -1166,7 +1168,6 @@ bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
|
||||
i = (i + 1) % kInFlightQueueSize;
|
||||
}
|
||||
|
||||
Mutex::Autolock iLock(mInternalsMutex);
|
||||
|
||||
if (mBuffers != NULL) {
|
||||
for (i = 0; i < mBuffers->size(); i++) {
|
||||
@@ -1547,26 +1548,47 @@ status_t EmulatedFakeCamera2::ControlThread::waitUntilRunning() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
// Override android.control.* fields with 3A values before sending request to sensor
|
||||
status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *request) {
|
||||
Mutex::Autolock lock(mInputMutex);
|
||||
// TODO: Add handling for all android.control.* fields here
|
||||
camera_metadata_entry_t mode;
|
||||
status_t res;
|
||||
|
||||
#define READ_IF_OK(res, what, def) \
|
||||
(((res) == OK) ? (what) : (uint8_t)(def))
|
||||
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_MODE,
|
||||
&mode);
|
||||
mControlMode = mode.data.u8[0];
|
||||
mControlMode = READ_IF_OK(res, mode.data.u8[0], ANDROID_CONTROL_MODE_OFF);
|
||||
|
||||
// disable all 3A
|
||||
if (mControlMode == ANDROID_CONTROL_MODE_OFF) {
|
||||
mEffectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
|
||||
mSceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
|
||||
mAfMode = ANDROID_CONTROL_AF_MODE_OFF;
|
||||
mAeLock = ANDROID_CONTROL_AE_LOCK_ON;
|
||||
mAeMode = ANDROID_CONTROL_AE_MODE_OFF;
|
||||
mAfModeChange = true;
|
||||
mStartAf = false;
|
||||
mCancelAf = true;
|
||||
mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
|
||||
mAwbMode = ANDROID_CONTROL_AWB_MODE_OFF;
|
||||
return res;
|
||||
}
|
||||
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_EFFECT_MODE,
|
||||
&mode);
|
||||
mEffectMode = mode.data.u8[0];
|
||||
mEffectMode = READ_IF_OK(res, mode.data.u8[0],
|
||||
ANDROID_CONTROL_EFFECT_MODE_OFF);
|
||||
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_SCENE_MODE,
|
||||
&mode);
|
||||
mSceneMode = mode.data.u8[0];
|
||||
mSceneMode = READ_IF_OK(res, mode.data.u8[0],
|
||||
ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED);
|
||||
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_AF_MODE,
|
||||
@@ -1582,12 +1604,15 @@ status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *r
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_AE_MODE,
|
||||
&mode);
|
||||
mAeMode = mode.data.u8[0];
|
||||
mAeMode = READ_IF_OK(res, mode.data.u8[0],
|
||||
ANDROID_CONTROL_AE_MODE_OFF);
|
||||
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_AE_LOCK,
|
||||
&mode);
|
||||
bool aeLock = (mode.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON);
|
||||
uint8_t aeLockVal = READ_IF_OK(res, mode.data.u8[0],
|
||||
ANDROID_CONTROL_AE_LOCK_ON);
|
||||
bool aeLock = (aeLockVal == ANDROID_CONTROL_AE_LOCK_ON);
|
||||
if (mAeLock && !aeLock) {
|
||||
mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
|
||||
}
|
||||
@@ -1596,7 +1621,8 @@ status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *r
|
||||
res = find_camera_metadata_entry(request,
|
||||
ANDROID_CONTROL_AWB_MODE,
|
||||
&mode);
|
||||
mAwbMode = mode.data.u8[0];
|
||||
mAwbMode = READ_IF_OK(res, mode.data.u8[0],
|
||||
ANDROID_CONTROL_AWB_MODE_OFF);
|
||||
|
||||
// TODO: Override more control fields
|
||||
|
||||
@@ -1610,6 +1636,8 @@ status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *r
|
||||
}
|
||||
}
|
||||
|
||||
#undef READ_IF_OK
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user