From 447e815bd76fc29967c357442028d52014161d90 Mon Sep 17 00:00:00 2001 From: Austin Borger Date: Thu, 24 Feb 2022 20:43:08 +0000 Subject: 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 --- core/java/android/hardware/CameraSessionStats.java | 11 ++++++++++- core/java/android/hardware/CameraStreamStats.java | 13 +++++++++++-- .../com/android/server/camera/CameraServiceProxy.java | 15 ++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core/java/android/hardware/CameraSessionStats.java b/core/java/android/hardware/CameraSessionStats.java index f34e2bf5ddc2..698cc76f6325 100644 --- a/core/java/android/hardware/CameraSessionStats.java +++ b/core/java/android/hardware/CameraSessionStats.java @@ -59,6 +59,7 @@ public class CameraSessionStats implements Parcelable { private long mRequestCount; private long mResultErrorCount; private boolean mDeviceError; + private float mMaxPreviewFps; private ArrayList 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(); @@ -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; } diff --git a/core/java/android/hardware/CameraStreamStats.java b/core/java/android/hardware/CameraStreamStats.java index 823d454ee16b..7b24cc4836d0 100644 --- a/core/java/android/hardware/CameraStreamStats.java +++ b/core/java/android/hardware/CameraStreamStats.java @@ -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; } diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java index ffba59895bdc..141d4f20e5d3 100644 --- a/services/core/java/com/android/server/camera/CameraServiceProxy.java +++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java @@ -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 -- cgit v1.2.3-59-g8ed1b