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

Commit deb90d74 authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "HdrClamper using feature flag and configuration" into main

parents e16c1746 ee321a75
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.display;
import android.hardware.display.BrightnessInfo;
import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager;

import com.android.server.display.brightness.clamper.HdrClamper;
import com.android.server.display.feature.DisplayManagerFlags;
@@ -52,17 +53,26 @@ class BrightnessRangeController {
            HdrClamper hdrClamper, DisplayManagerFlags flags) {
        mHbmController = hbmController;
        mModeChangeCallback = modeChangeCallback;
        mUseHdrClamper = false;
        mUseNbmController = flags.isNbmControllerEnabled();
        mNormalBrightnessModeController.resetNbmData(displayDeviceConfig.getLuxThrottlingData());
        mHdrClamper = hdrClamper;
        mUseHdrClamper = flags.isHdrClamperEnabled();
        mUseNbmController = flags.isNbmControllerEnabled();
        if (mUseNbmController) {
            mNormalBrightnessModeController.resetNbmData(
                    displayDeviceConfig.getLuxThrottlingData());
        }
        if (mUseHdrClamper) {
            mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData());
        }

    }

    void dump(PrintWriter pw) {
        pw.println("BrightnessRangeController:");
        pw.println("  mUseNormalBrightnessController=" + mUseNbmController);
        pw.println("  mUseHdrClamper=" + mUseHdrClamper);
        mHbmController.dump(pw);
        mNormalBrightnessModeController.dump(pw);
        mHdrClamper.dump(pw);
    }

    void onAmbientLuxChange(float ambientLux) {
@@ -91,6 +101,9 @@ class BrightnessRangeController {
                            displayDeviceConfig::getHdrBrightnessFromSdr);
                }
        );
        if (mUseHdrClamper) {
            mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData());
        }
    }

    void stop() {
@@ -129,7 +142,9 @@ class BrightnessRangeController {

    float getHdrBrightnessValue() {
        float hdrBrightness = mHbmController.getHdrBrightnessValue();
        return Math.min(hdrBrightness, mHdrClamper.getMaxBrightness());
        float brightnessMax = mUseHdrClamper ? mHdrClamper.getMaxBrightness()
                : PowerManager.BRIGHTNESS_MAX;
        return Math.min(hdrBrightness, brightnessMax);
    }

    float getTransitionPoint() {
@@ -151,6 +166,6 @@ class BrightnessRangeController {
    }

    public float getHdrTransitionRate() {
        return mHdrClamper.getTransitionRate();
        return mUseHdrClamper ? mHdrClamper.getTransitionRate() : -1;
    }
}
+55 −41
Original line number Diff line number Diff line
@@ -16,40 +16,41 @@

package com.android.server.display.brightness.clamper;

import android.annotation.Nullable;
import android.os.Handler;
import android.os.PowerManager;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.config.HdrBrightnessData;

import java.util.HashMap;
import java.io.PrintWriter;
import java.util.Map;

public class HdrClamper {

    private final Configuration mConfiguration = new Configuration();

    private final BrightnessClamperController.ClamperChangeListener mClamperChangeListener;

    private final Handler mHandler;

    private final Runnable mDebouncer;

    private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX;
    @Nullable
    private HdrBrightnessData mHdrBrightnessData = null;

    // brightness change speed, in units per seconds,
    private float mTransitionRate = -1f;
    private float mAmbientLux = Float.MAX_VALUE;

    private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX;
    private float mDesiredMaxBrightness = PowerManager.BRIGHTNESS_MAX;

    private float mDesiredTransitionDuration = -1; // in seconds
    // brightness change speed, in units per seconds,
    private float mTransitionRate = -1f;
    private float mDesiredTransitionRate = -1f;

    public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener,
            Handler handler) {
        mClamperChangeListener = clamperChangeListener;
        mHandler = handler;
        mDebouncer = () -> {
            mTransitionRate = Math.abs((mMaxBrightness - mDesiredMaxBrightness)
                    / mDesiredTransitionDuration);
            mTransitionRate = mDesiredTransitionRate;
            mMaxBrightness = mDesiredMaxBrightness;
            mClamperChangeListener.onChanged();
        };
@@ -65,46 +66,74 @@ public class HdrClamper {
        return mTransitionRate;
    }


    /**
     * Updates brightness cap in response to ambient lux change.
     * Called by ABC in same looper: mHandler.getLooper()
     */
    public void onAmbientLuxChange(float ambientLux) {
        float expectedMaxBrightness = findBrightnessLimit(ambientLux);
        mAmbientLux = ambientLux;
        recalculateBrightnessCap(mHdrBrightnessData, ambientLux);
    }

    /**
     * Updates brightness cap config.
     * Called in same looper: mHandler.getLooper()
     */
    public void resetHdrConfig(HdrBrightnessData data) {
        mHdrBrightnessData = data;
        recalculateBrightnessCap(data, mAmbientLux);
    }

    /**
     * Dumps the state of HdrClamper.
     */
    public void dump(PrintWriter pw) {
        pw.println("HdrClamper:");
        pw.println("  mMaxBrightness=" + mMaxBrightness);
        pw.println("  mDesiredMaxBrightness=" + mDesiredMaxBrightness);
        pw.println("  mTransitionRate=" + mTransitionRate);
        pw.println("  mDesiredTransitionRate=" + mDesiredTransitionRate);
        pw.println("  mHdrBrightnessData=" + (mHdrBrightnessData == null ? "null"
                : mHdrBrightnessData.toString()));
        pw.println("  mAmbientLux=" + mAmbientLux);
    }

    private void recalculateBrightnessCap(HdrBrightnessData data, float ambientLux) {
        if (data == null) {
            mHandler.removeCallbacks(mDebouncer);
            return;
        }
        float expectedMaxBrightness = findBrightnessLimit(data, ambientLux);

        if (mMaxBrightness == expectedMaxBrightness) {
            mDesiredMaxBrightness = mMaxBrightness;
            mDesiredTransitionDuration = -1;
            mDesiredTransitionRate = -1f;
            mTransitionRate = -1f;
            mHandler.removeCallbacks(mDebouncer);
        } else if (mDesiredMaxBrightness != expectedMaxBrightness) {
            mDesiredMaxBrightness = expectedMaxBrightness;
            long debounceTime;
            long transitionDuration;
            if (mDesiredMaxBrightness > mMaxBrightness) {
                debounceTime = mConfiguration.mIncreaseConfig.mDebounceTimeMillis;
                mDesiredTransitionDuration =
                        (float) mConfiguration.mIncreaseConfig.mTransitionTimeMillis / 1000;
                debounceTime = mHdrBrightnessData.mBrightnessIncreaseDebounceMillis;
                transitionDuration = mHdrBrightnessData.mBrightnessIncreaseDurationMillis;
            } else {
                debounceTime = mConfiguration.mDecreaseConfig.mDebounceTimeMillis;
                mDesiredTransitionDuration =
                        (float) mConfiguration.mDecreaseConfig.mTransitionTimeMillis / 1000;
                debounceTime = mHdrBrightnessData.mBrightnessDecreaseDebounceMillis;
                transitionDuration = mHdrBrightnessData.mBrightnessDecreaseDurationMillis;
            }
            mDesiredTransitionRate = Math.abs(
                    (mMaxBrightness - mDesiredMaxBrightness) * 1000f / transitionDuration);

            mHandler.removeCallbacks(mDebouncer);
            mHandler.postDelayed(mDebouncer, debounceTime);
        }
    }

    @VisibleForTesting
    Configuration getConfiguration() {
        return mConfiguration;
    }

    private float findBrightnessLimit(float ambientLux) {
    private float findBrightnessLimit(HdrBrightnessData data, float ambientLux) {
        float foundAmbientBoundary = Float.MAX_VALUE;
        float foundMaxBrightness = PowerManager.BRIGHTNESS_MAX;
        for (Map.Entry<Float, Float> brightnessPoint :
                mConfiguration.mMaxBrightnessLimits.entrySet()) {
                data.mMaxBrightnessLimits.entrySet()) {
            float ambientBoundary = brightnessPoint.getKey();
            // find ambient lux upper boundary closest to current ambient lux
            if (ambientBoundary > ambientLux && ambientBoundary < foundAmbientBoundary) {
@@ -114,19 +143,4 @@ public class HdrClamper {
        }
        return foundMaxBrightness;
    }

    @VisibleForTesting
    static class Configuration {
        final Map<Float, Float> mMaxBrightnessLimits = new HashMap<>();
        final TransitionConfiguration mIncreaseConfig = new TransitionConfiguration();

        final TransitionConfiguration mDecreaseConfig = new TransitionConfiguration();
    }

    @VisibleForTesting
    static class TransitionConfiguration {
        long mDebounceTimeMillis;

        long mTransitionTimeMillis;
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.server.display.config;

import android.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -52,7 +54,8 @@ public class HdrBrightnessData {
     */
    public final long mBrightnessDecreaseDurationMillis;

    private HdrBrightnessData(Map<Float, Float> maxBrightnessLimits,
    @VisibleForTesting
    public HdrBrightnessData(Map<Float, Float> maxBrightnessLimits,
            long brightnessIncreaseDebounceMillis, long brightnessIncreaseDurationMillis,
            long brightnessDecreaseDebounceMillis, long brightnessDecreaseDurationMillis) {
        mMaxBrightnessLimits = maxBrightnessLimits;
+8 −0
Original line number Diff line number Diff line
@@ -39,6 +39,10 @@ public class DisplayManagerFlags {
            Flags.FLAG_ENABLE_NBM_CONTROLLER,
            Flags::enableNbmController);

    private final FlagState mHdrClamperFlagState = new FlagState(
            Flags.FLAG_ENABLE_HDR_CLAMPER,
            Flags::enableHdrClamper);

    /** Returns whether connected display management is enabled or not. */
    public boolean isConnectedDisplayManagementEnabled() {
        return mConnectedDisplayManagementFlagState.isEnabled();
@@ -49,6 +53,10 @@ public class DisplayManagerFlags {
        return mNbmControllerFlagState.isEnabled();
    }

    public boolean isHdrClamperEnabled() {
        return mHdrClamperFlagState.isEnabled();
    }

    private static class FlagState {

        private final String mName;
+9 −1
Original line number Diff line number Diff line
@@ -14,6 +14,14 @@ flag {
    name: "enable_nbm_controller"
    namespace: "display_manager"
    description: "Feature flag for Normal Brightness Mode Controller"
    bug: "277877297"
    bug: "299527549"
    is_fixed_read_only: true
}

flag {
    name: "enable_hdr_clamper"
    namespace: "display_manager"
    description: "Feature flag for HDR Clamper"
    bug: "295100043"
    is_fixed_read_only: true
}
Loading