camera2: (LEGACY) Update flash modes to fix #testFlashControl CTS
Change-Id: I9b66a2b4393f4bc2272ecc94cd9a5c6273f3de59
This commit is contained in:
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user