Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30f01591 authored by Igor Murashkin's avatar Igor Murashkin Committed by Android (Google) Code Review
Browse files

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

parents 685206cb 396532ff
Loading
Loading
Loading
Loading
+55 −19
Original line number Diff line number Diff line
@@ -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);
            }
        } 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);
            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) {
                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));
        }
    }

+46 −24
Original line number Diff line number Diff line
@@ -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,14 +227,21 @@ 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()) {
        String flashModeSetting = p.getFlashMode();

        if (flashModeSetting != null) {
            switch (flashModeSetting) {
                case Parameters.FLASH_MODE_OFF:
                    break; // ok, using default
                case Parameters.FLASH_MODE_AUTO:
@@ -234,18 +249,25 @@ public class LegacyResultMapper {
                    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());
                    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