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:
Igor Murashkin
2013-01-10 13:34:31 -08:00
committed by Android (Google) Code Review
2 changed files with 37 additions and 9 deletions

View File

@@ -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);

View File

@@ -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;
}