camera2: (LEGACY) Update flash modes to fix #testFlashControl CTS

Change-Id: I9b66a2b4393f4bc2272ecc94cd9a5c6273f3de59
This commit is contained in:
Igor Murashkin
2014-07-10 18:08:47 -07:00
parent 49a1d7b7de
commit 396532ffb8
2 changed files with 101 additions and 43 deletions

View File

@ -258,34 +258,70 @@ public class LegacyRequestMapper {
List<String> supportedFlashModes = p.getSupportedFlashModes();
String flashModeSetting = null;
// Flash is OFF by default, on cameras that support flash
if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_OFF)) {
flashModeSetting = Parameters.FLASH_MODE_OFF;
}
/*
* Map all of the control.aeMode* enums, but ignore AE_MODE_OFF since we never support it
*/
// Ignore flash.mode controls unless aeMode == ON
if (aeMode == CONTROL_AE_MODE_ON) {
// Flash is OFF by default
p.setFlashMode(Parameters.FLASH_MODE_OFF);
if (flashMode == FLASH_MODE_TORCH &&
ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_TORCH)) {
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
} else if (flashMode == FLASH_MODE_SINGLE &&
ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) {
p.setFlashMode(Parameters.FLASH_MODE_ON);
if (flashMode == FLASH_MODE_TORCH) {
if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_TORCH)) {
flashModeSetting = Parameters.FLASH_MODE_TORCH;
} else {
Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == TORCH;" +
"camera does not support it");
}
} else if (flashMode == FLASH_MODE_SINGLE) {
if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) {
flashModeSetting = Parameters.FLASH_MODE_ON;
} else {
Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == SINGLE;" +
"camera does not support it");
}
} else {
// Use the default FLASH_MODE_OFF
}
} else if (aeMode == CONTROL_AE_MODE_ON_ALWAYS_FLASH &&
ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) {
p.setFlashMode(Parameters.FLASH_MODE_ON);
} else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH &&
ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_AUTO)) {
p.setFlashMode(Parameters.FLASH_MODE_AUTO);
} else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE &&
ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_RED_EYE)) {
p.setFlashMode(Parameters.FLASH_MODE_RED_EYE);
} else if (aeMode == CONTROL_AE_MODE_ON_ALWAYS_FLASH) {
if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) {
flashModeSetting = Parameters.FLASH_MODE_ON;
} else {
Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_ALWAYS_FLASH;" +
"camera does not support it");
}
} else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH) {
if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_AUTO)) {
flashModeSetting = Parameters.FLASH_MODE_AUTO;
} else {
Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH;" +
"camera does not support it");
}
} else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_RED_EYE)) {
flashModeSetting = Parameters.FLASH_MODE_RED_EYE;
} else {
Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH_REDEYE;"
+ "camera does not support it");
}
} else {
// Default to aeMode == ON, flash = OFF
p.setFlashMode(Parameters.FLASH_MODE_OFF);
}
if (flashModeSetting != null) {
p.setFlashMode(flashModeSetting);
}
if (VERBOSE) {
Log.v(TAG,
"mapAeAndFlashMode - set flash.mode (api1) to " + flashModeSetting
+ ", requested (api2) " + flashMode
+ ", supported (api1) " + ListUtils.listToString(supportedFlashModes));
}
}

View File

@ -80,7 +80,7 @@ public class LegacyResultMapper {
/*
* control.ae*
*/
mapAe(result, request, activeArraySize, zoomData, /*out*/params);
mapAe(result, characteristics, request, activeArraySize, zoomData, /*out*/params);
// control.awbLock
result.set(CaptureResult.CONTROL_AWB_LOCK, params.getAutoWhiteBalanceLock());
@ -100,6 +100,13 @@ public class LegacyResultMapper {
request.get(CaptureRequest.CONTROL_AWB_MODE));
}
/*
* flash
*/
{
// TODO
}
/*
* lens
*/
@ -122,6 +129,7 @@ public class LegacyResultMapper {
}
private static void mapAe(CameraMetadataNative m,
CameraCharacteristics characteristics,
CaptureRequest request, Rect activeArray, ZoomData zoomData, /*out*/Parameters p) {
// control.aeAntiBandingMode
{
@ -153,8 +161,8 @@ public class LegacyResultMapper {
}
}
// control.aeMode, flash.mode
mapAeAndFlashMode(m, p);
// control.aeMode, flash.mode, flash.state
mapAeAndFlashMode(m, characteristics, p);
// control.aeState
if (LegacyMetadataMapper.LIE_ABOUT_AE_STATE) {
@ -219,33 +227,47 @@ public class LegacyResultMapper {
return meteringRectList.toArray(new MeteringRectangle[0]);
}
/** Map results for control.aeMode, flash.mode */
private static void mapAeAndFlashMode(CameraMetadataNative m, /*out*/Parameters p) {
/** Map results for control.aeMode, flash.mode, flash.state */
private static void mapAeAndFlashMode(CameraMetadataNative m,
CameraCharacteristics characteristics, Parameters p) {
// Default: AE mode on but flash never fires
int flashMode = FLASH_MODE_OFF;
// If there is no flash on this camera, the state is always unavailable
// , otherwise it's only known for TORCH/SINGLE modes
Integer flashState = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)
? null : FLASH_STATE_UNAVAILABLE;
int aeMode = CONTROL_AE_MODE_ON;
switch (p.getFlashMode()) {
case Parameters.FLASH_MODE_OFF:
break; // ok, using default
case Parameters.FLASH_MODE_AUTO:
aeMode = CONTROL_AE_MODE_ON_AUTO_FLASH;
break;
case Parameters.FLASH_MODE_ON:
// flashMode = SINGLE + aeMode = ON is indistinguishable from ON_ALWAYS_FLASH
aeMode = CONTROL_AE_MODE_ON_ALWAYS_FLASH;
break;
case Parameters.FLASH_MODE_RED_EYE:
aeMode = CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
break;
case Parameters.FLASH_MODE_TORCH:
flashMode = FLASH_MODE_TORCH;
break;
default:
Log.w(TAG, "mapAeAndFlashMode - Ignoring unknown flash mode " + p.getFlashMode());
String flashModeSetting = p.getFlashMode();
if (flashModeSetting != null) {
switch (flashModeSetting) {
case Parameters.FLASH_MODE_OFF:
break; // ok, using default
case Parameters.FLASH_MODE_AUTO:
aeMode = CONTROL_AE_MODE_ON_AUTO_FLASH;
break;
case Parameters.FLASH_MODE_ON:
// flashMode = SINGLE + aeMode = ON is indistinguishable from ON_ALWAYS_FLASH
flashMode = FLASH_MODE_SINGLE;
aeMode = CONTROL_AE_MODE_ON_ALWAYS_FLASH;
flashState = FLASH_STATE_FIRED;
break;
case Parameters.FLASH_MODE_RED_EYE:
aeMode = CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
break;
case Parameters.FLASH_MODE_TORCH:
flashMode = FLASH_MODE_TORCH;
flashState = FLASH_STATE_FIRED;
break;
default:
Log.w(TAG,
"mapAeAndFlashMode - Ignoring unknown flash mode " + p.getFlashMode());
}
}
// flash.state
m.set(FLASH_STATE, flashState);
// flash.mode
m.set(FLASH_MODE, flashMode);
// control.aeMode