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()) {
|
if (camera_id < 0 || camera_id >= getEmulatedCameraNum()) {
|
||||||
ALOGE("%s: Camera id %d is out of bounds (%d)",
|
ALOGE("%s: Camera id %d is out of bounds (%d)",
|
||||||
__FUNCTION__, camera_id, getEmulatedCameraNum());
|
__FUNCTION__, camera_id, getEmulatedCameraNum());
|
||||||
return -EINVAL;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mEmulatedCameras[camera_id]->connectCamera(device);
|
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()) {
|
if (camera_id < 0 || camera_id >= getEmulatedCameraNum()) {
|
||||||
ALOGE("%s: Camera id %d is out of bounds (%d)",
|
ALOGE("%s: Camera id %d is out of bounds (%d)",
|
||||||
__FUNCTION__, camera_id, getEmulatedCameraNum());
|
__FUNCTION__, camera_id, getEmulatedCameraNum());
|
||||||
return -EINVAL;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mEmulatedCameras[camera_id]->getCameraInfo(info);
|
return mEmulatedCameras[camera_id]->getCameraInfo(info);
|
||||||
|
|||||||
@@ -1155,6 +1155,8 @@ void EmulatedFakeCamera2::ReadoutThread::setNextOperation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
|
bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
|
||||||
|
// acquire in same order as threadLoop
|
||||||
|
Mutex::Autolock iLock(mInternalsMutex);
|
||||||
Mutex::Autolock lock(mInputMutex);
|
Mutex::Autolock lock(mInputMutex);
|
||||||
|
|
||||||
size_t i = mInFlightHead;
|
size_t i = mInFlightHead;
|
||||||
@@ -1166,7 +1168,6 @@ bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
|
|||||||
i = (i + 1) % kInFlightQueueSize;
|
i = (i + 1) % kInFlightQueueSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex::Autolock iLock(mInternalsMutex);
|
|
||||||
|
|
||||||
if (mBuffers != NULL) {
|
if (mBuffers != NULL) {
|
||||||
for (i = 0; i < mBuffers->size(); i++) {
|
for (i = 0; i < mBuffers->size(); i++) {
|
||||||
@@ -1547,26 +1548,47 @@ status_t EmulatedFakeCamera2::ControlThread::waitUntilRunning() {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Override android.control.* fields with 3A values before sending request to sensor
|
||||||
status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *request) {
|
status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *request) {
|
||||||
Mutex::Autolock lock(mInputMutex);
|
Mutex::Autolock lock(mInputMutex);
|
||||||
// TODO: Add handling for all android.control.* fields here
|
// TODO: Add handling for all android.control.* fields here
|
||||||
camera_metadata_entry_t mode;
|
camera_metadata_entry_t mode;
|
||||||
status_t res;
|
status_t res;
|
||||||
|
|
||||||
|
#define READ_IF_OK(res, what, def) \
|
||||||
|
(((res) == OK) ? (what) : (uint8_t)(def))
|
||||||
|
|
||||||
res = find_camera_metadata_entry(request,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_MODE,
|
ANDROID_CONTROL_MODE,
|
||||||
&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,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_EFFECT_MODE,
|
ANDROID_CONTROL_EFFECT_MODE,
|
||||||
&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,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_SCENE_MODE,
|
ANDROID_CONTROL_SCENE_MODE,
|
||||||
&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,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_AF_MODE,
|
ANDROID_CONTROL_AF_MODE,
|
||||||
@@ -1582,12 +1604,15 @@ status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *r
|
|||||||
res = find_camera_metadata_entry(request,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_AE_MODE,
|
ANDROID_CONTROL_AE_MODE,
|
||||||
&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,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_AE_LOCK,
|
ANDROID_CONTROL_AE_LOCK,
|
||||||
&mode);
|
&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) {
|
if (mAeLock && !aeLock) {
|
||||||
mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
|
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,
|
res = find_camera_metadata_entry(request,
|
||||||
ANDROID_CONTROL_AWB_MODE,
|
ANDROID_CONTROL_AWB_MODE,
|
||||||
&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
|
// TODO: Override more control fields
|
||||||
|
|
||||||
@@ -1610,6 +1636,8 @@ status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *r
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef READ_IF_OK
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user