Merge "Provide refresh rate range to the window manager based on the maximum frame rate of each camera stream." into tm-dev

This commit is contained in:
Austin Borger
2022-03-08 23:26:22 +00:00
committed by Android (Google) Code Review
3 changed files with 33 additions and 6 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
@@ -821,6 +824,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
@@ -1015,6 +1019,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();
@@ -1068,9 +1077,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