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

Commit 447e815b authored by Austin Borger's avatar Austin Borger
Browse files

Provide refresh rate range to the window manager based on the maximum

frame rate of each camera stream.

Bug: 209669709
Test: Verified values received by the CameraServiceProxy are reasonable.
Change-Id: I5cff78bf6f055e5f04ed5da33d5d6ef3a3d64bb6
parent edfaf5ac
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ public class CameraSessionStats implements Parcelable {
    private long mRequestCount;
    private long mResultErrorCount;
    private boolean mDeviceError;
    private float mMaxPreviewFps;
    private ArrayList<CameraStreamStats> mStreamStats;

    public CameraSessionStats() {
@@ -67,6 +68,7 @@ public class CameraSessionStats implements Parcelable {
        mApiLevel = -1;
        mIsNdk = false;
        mLatencyMs = -1;
        mMaxPreviewFps = 0;
        mSessionType = -1;
        mInternalReconfigure = -1;
        mRequestCount = 0;
@@ -77,7 +79,7 @@ public class CameraSessionStats implements Parcelable {

    public CameraSessionStats(String cameraId, int facing, int newCameraState,
            String clientName, int apiLevel, boolean isNdk, int creationDuration,
            int sessionType, int internalReconfigure) {
            float maxPreviewFps, int sessionType, int internalReconfigure) {
        mCameraId = cameraId;
        mFacing = facing;
        mNewCameraState = newCameraState;
@@ -85,6 +87,7 @@ public class CameraSessionStats implements Parcelable {
        mApiLevel = apiLevel;
        mIsNdk = isNdk;
        mLatencyMs = creationDuration;
        mMaxPreviewFps = maxPreviewFps;
        mSessionType = sessionType;
        mInternalReconfigure = internalReconfigure;
        mStreamStats = new ArrayList<CameraStreamStats>();
@@ -121,6 +124,7 @@ public class CameraSessionStats implements Parcelable {
        dest.writeInt(mApiLevel);
        dest.writeBoolean(mIsNdk);
        dest.writeInt(mLatencyMs);
        dest.writeFloat(mMaxPreviewFps);
        dest.writeInt(mSessionType);
        dest.writeInt(mInternalReconfigure);
        dest.writeLong(mRequestCount);
@@ -137,6 +141,7 @@ public class CameraSessionStats implements Parcelable {
        mApiLevel = in.readInt();
        mIsNdk = in.readBoolean();
        mLatencyMs = in.readInt();
        mMaxPreviewFps = in.readFloat();
        mSessionType = in.readInt();
        mInternalReconfigure = in.readInt();
        mRequestCount = in.readLong();
@@ -176,6 +181,10 @@ public class CameraSessionStats implements Parcelable {
        return mLatencyMs;
    }

    public float getMaxPreviewFps() {
        return mMaxPreviewFps;
    }

    public int getSessionType() {
        return mSessionType;
    }
+11 −2
Original line number Diff line number Diff line
@@ -15,8 +15,8 @@
 */
package android.hardware;

import android.hardware.camera2.params.DynamicRangeProfiles;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.params.DynamicRangeProfiles;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
@@ -37,6 +37,7 @@ public class CameraStreamStats implements Parcelable {
    private int mWidth;
    private int mHeight;
    private int mFormat;
    private float mMaxPreviewFps;
    private int mDataSpace;
    private long mUsage;
    private long mRequestCount;
@@ -56,6 +57,7 @@ public class CameraStreamStats implements Parcelable {
        mWidth = 0;
        mHeight = 0;
        mFormat = 0;
        mMaxPreviewFps = 0;
        mDataSpace = 0;
        mUsage = 0;
        mRequestCount = 0;
@@ -68,13 +70,14 @@ public class CameraStreamStats implements Parcelable {
        mStreamUseCase = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT;
    }

    public CameraStreamStats(int width, int height, int format,
    public CameraStreamStats(int width, int height, int format, float maxPreviewFps,
            int dataSpace, long usage, long requestCount, long errorCount,
            int startLatencyMs, int maxHalBuffers, int maxAppBuffers, long dynamicRangeProfile,
            int streamUseCase) {
        mWidth = width;
        mHeight = height;
        mFormat = format;
        mMaxPreviewFps = maxPreviewFps;
        mDataSpace = dataSpace;
        mUsage = usage;
        mRequestCount = requestCount;
@@ -120,6 +123,7 @@ public class CameraStreamStats implements Parcelable {
        dest.writeInt(mWidth);
        dest.writeInt(mHeight);
        dest.writeInt(mFormat);
        dest.writeFloat(mMaxPreviewFps);
        dest.writeInt(mDataSpace);
        dest.writeLong(mUsage);
        dest.writeLong(mRequestCount);
@@ -138,6 +142,7 @@ public class CameraStreamStats implements Parcelable {
        mWidth = in.readInt();
        mHeight = in.readInt();
        mFormat = in.readInt();
        mMaxPreviewFps = in.readFloat();
        mDataSpace = in.readInt();
        mUsage = in.readLong();
        mRequestCount = in.readLong();
@@ -164,6 +169,10 @@ public class CameraStreamStats implements Parcelable {
        return mFormat;
    }

    public float getMaxPreviewFps() {
        return mMaxPreviewFps;
    }

    public int getDataSpace() {
        return mDataSpace;
    }
+12 −3
Original line number Diff line number Diff line
@@ -184,6 +184,9 @@ public class CameraServiceProxy extends SystemService
    // Must be equal to number of CameraStreamProto in CameraActionEvent
    private static final int MAX_STREAM_STATISTICS = 5;

    private static final float MIN_PREVIEW_FPS = 30.0f;
    private static final float MAX_PREVIEW_FPS = 60.0f;

    private final Context mContext;
    private final ServiceThread mHandlerThread;
    private final Handler mHandler;
@@ -816,6 +819,7 @@ public class CameraServiceProxy extends SystemService
                        Slog.v(TAG, "Stream " + i + ": width " + streamProtos[i].width
                                + ", height " + streamProtos[i].height
                                + ", format " + streamProtos[i].format
                                + ", maxPreviewFps " + streamStats.getMaxPreviewFps()
                                + ", dataSpace " + streamProtos[i].dataSpace
                                + ", usage " + streamProtos[i].usage
                                + ", requestCount " + streamProtos[i].requestCount
@@ -1010,6 +1014,11 @@ public class CameraServiceProxy extends SystemService
        return false;
    }

    private float getMinFps(CameraSessionStats cameraState) {
        float maxFps = cameraState.getMaxPreviewFps();
        return Math.max(Math.min(maxFps, MAX_PREVIEW_FPS), MIN_PREVIEW_FPS);
    }

    private void updateActivityCount(CameraSessionStats cameraState) {
        String cameraId = cameraState.getCameraId();
        int newCameraState = cameraState.getNewCameraState();
@@ -1063,9 +1072,9 @@ public class CameraServiceProxy extends SystemService
                    if (!alreadyActivePackage) {
                        WindowManagerInternal wmi =
                                LocalServices.getService(WindowManagerInternal.class);
                        // TODO(b/209669709): populate min.max refreshRate based on
                        //  the camera capture speed
                        wmi.addRefreshRateRangeForPackage(clientName, 60.0f, 60.0f);
                        float minFps = getMinFps(cameraState);
                        wmi.addRefreshRateRangeForPackage(clientName,
                                minFps, MAX_PREVIEW_FPS);
                    }

                    // Update activity events