summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/CameraSessionStats.java14
-rw-r--r--services/core/java/com/android/server/camera/CameraServiceProxy.java91
2 files changed, 101 insertions, 4 deletions
diff --git a/core/java/android/hardware/CameraSessionStats.java b/core/java/android/hardware/CameraSessionStats.java
index 32938ffae63d..e5c12e327fdb 100644
--- a/core/java/android/hardware/CameraSessionStats.java
+++ b/core/java/android/hardware/CameraSessionStats.java
@@ -16,9 +16,11 @@
package android.hardware;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Range;
import java.util.ArrayList;
import java.util.List;
+
/**
* The camera action state used for passing camera usage information from
* camera service to camera service proxy .
@@ -66,6 +68,7 @@ public class CameraSessionStats implements Parcelable {
private int mVideoStabilizationMode;
private boolean mUsedUltraWide;
private boolean mUsedZoomOverride;
+ private Range<Integer> mMostRequestedFpsRange;
private int mSessionIndex;
private CameraExtensionSessionStats mCameraExtensionSessionStats;
@@ -86,6 +89,7 @@ public class CameraSessionStats implements Parcelable {
mVideoStabilizationMode = -1;
mUsedUltraWide = false;
mUsedZoomOverride = false;
+ mMostRequestedFpsRange = new Range<Integer>(0, 0);
mSessionIndex = 0;
mCameraExtensionSessionStats = new CameraExtensionSessionStats();
}
@@ -109,6 +113,7 @@ public class CameraSessionStats implements Parcelable {
mVideoStabilizationMode = -1;
mUsedUltraWide = false;
mUsedZoomOverride = false;
+ mMostRequestedFpsRange = new Range<Integer>(0, 0);
mSessionIndex = sessionIdx;
mCameraExtensionSessionStats = new CameraExtensionSessionStats();
}
@@ -158,6 +163,8 @@ public class CameraSessionStats implements Parcelable {
dest.writeBoolean(mUsedZoomOverride);
dest.writeInt(mSessionIndex);
mCameraExtensionSessionStats.writeToParcel(dest, 0);
+ dest.writeInt(mMostRequestedFpsRange.getLower());
+ dest.writeInt(mMostRequestedFpsRange.getUpper());
}
public void readFromParcel(Parcel in) {
@@ -188,6 +195,9 @@ public class CameraSessionStats implements Parcelable {
mSessionIndex = in.readInt();
mCameraExtensionSessionStats = CameraExtensionSessionStats.CREATOR.createFromParcel(in);
+ int minFps = in.readInt();
+ int maxFps = in.readInt();
+ mMostRequestedFpsRange = new Range<Integer>(minFps, maxFps);
}
public String getCameraId() {
@@ -273,4 +283,8 @@ public class CameraSessionStats implements Parcelable {
public CameraExtensionSessionStats getExtensionSessionStats() {
return mCameraExtensionSessionStats;
}
+
+ public Range<Integer> getMostRequestedFpsRange() {
+ return mMostRequestedFpsRange;
+ }
}
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 05e681edb05e..645a3664681b 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -61,6 +61,9 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -69,6 +72,7 @@ import android.stats.camera.nano.CameraProtos.CameraStreamProto;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Range;
import android.util.Slog;
import android.view.Display;
import android.view.IDisplayWindowListener;
@@ -85,6 +89,8 @@ import com.android.server.ServiceThread;
import com.android.server.SystemService;
import com.android.server.wm.WindowManagerInternal;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -243,6 +249,7 @@ public class CameraServiceProxy extends SystemService
public int mVideoStabilizationMode;
public boolean mUsedUltraWide;
public boolean mUsedZoomOverride;
+ public Range<Integer> mMostRequestedFpsRange;
public final long mLogId;
public final int mSessionIndex;
@@ -265,13 +272,15 @@ public class CameraServiceProxy extends SystemService
mDeviceError = deviceError;
mLogId = logId;
mSessionIndex = sessionIdx;
+ mMostRequestedFpsRange = new Range<Integer>(0, 0);
}
public void markCompleted(int internalReconfigure, long requestCount,
long resultErrorCount, boolean deviceError,
List<CameraStreamStats> streamStats, String userTag,
int videoStabilizationMode, boolean usedUltraWide,
- boolean usedZoomOverride, CameraExtensionSessionStats extStats) {
+ boolean usedZoomOverride, Range<Integer> mostRequestedFpsRange,
+ CameraExtensionSessionStats extStats) {
if (mCompleted) {
return;
}
@@ -287,6 +296,7 @@ public class CameraServiceProxy extends SystemService
mUsedUltraWide = usedUltraWide;
mUsedZoomOverride = usedZoomOverride;
mExtSessionStats = extStats;
+ mMostRequestedFpsRange = mostRequestedFpsRange;
if (CameraServiceProxy.DEBUG) {
Slog.v(TAG, "A camera facing " + cameraFacingToString(mCameraFacing) +
" was in use by " + mClientName + " for " +
@@ -637,6 +647,60 @@ public class CameraServiceProxy extends SystemService
Binder.restoreCallingIdentity(ident);
}
}
+
+ @Override
+ public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
+ String[] args, ShellCallback callback, ResultReceiver resultReceiver)
+ throws RemoteException {
+ new CSPShellCmd(CameraServiceProxy.this)
+ .exec(this, in, out, err, args, callback, resultReceiver);
+ }
+
+ private static class CSPShellCmd extends ShellCommand {
+ private static final String TAG = "CSPShellCmd";
+ private static final String USAGE = """
+ usage: cmd media.camera.proxy SUBCMD [args]
+
+ SUBCMDs:
+ dump_events: Write out all collected camera usage events to statsd.
+ Does not print to terminal.
+ help: You're reading it.
+ """;
+
+ private final CameraServiceProxy mCameraServiceProxy;
+
+ CSPShellCmd(CameraServiceProxy proxy) {
+ mCameraServiceProxy = proxy;
+ }
+
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+ final PrintWriter pw = getOutPrintWriter();
+ try {
+ switch (cmd.replace('-', '_')) {
+ case "dump_events":
+ int eventCount = mCameraServiceProxy.getUsageEventCount();
+ mCameraServiceProxy.dumpUsageEvents();
+ pw.println("Camera usage events dumped: " + eventCount);
+ break;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ } catch (Exception e) {
+ Slog.e(mCameraServiceProxy.TAG, "Error running shell command", e);
+ return 1;
+ }
+ return 0;
+ }
+
+ @Override
+ public void onHelp() {
+ getOutPrintWriter().println(USAGE);
+ }
+ }
};
private final FoldStateListener mFoldStateListener;
@@ -882,6 +946,9 @@ public class CameraServiceProxy extends SystemService
? ", zoomOverrideUsage " + e.mUsedZoomOverride
: "";
+ String mostRequestedFpsRangeDebug = Flags.analytics24q3()
+ ? ", mostRequestedFpsRange " + e.mMostRequestedFpsRange
+ : "";
Slog.v(TAG, "CAMERA_ACTION_EVENT: action " + e.mAction
+ " clientName " + e.mClientName
+ ", duration " + e.getDuration()
@@ -900,6 +967,7 @@ public class CameraServiceProxy extends SystemService
+ ", videoStabilizationMode " + e.mVideoStabilizationMode
+ ultrawideDebug
+ zoomOverrideDebug
+ + mostRequestedFpsRangeDebug
+ ", logId " + e.mLogId
+ ", sessionIndex " + e.mSessionIndex
+ ", mExtSessionStats {type " + extensionType
@@ -966,7 +1034,17 @@ public class CameraServiceProxy extends SystemService
e.mUserTag, e.mVideoStabilizationMode,
e.mLogId, e.mSessionIndex,
extensionType, extensionIsAdvanced, e.mUsedUltraWide,
- e.mUsedZoomOverride);
+ e.mUsedZoomOverride,
+ e.mMostRequestedFpsRange.getLower(), e.mMostRequestedFpsRange.getUpper());
+ }
+ }
+
+ /**
+ * Get camera usage event count
+ */
+ int getUsageEventCount() {
+ synchronized (mLock) {
+ return mCameraUsageHistory.size();
}
}
@@ -1173,6 +1251,10 @@ public class CameraServiceProxy extends SystemService
long logId = cameraState.getLogId();
int sessionIdx = cameraState.getSessionIndex();
CameraExtensionSessionStats extSessionStats = cameraState.getExtensionSessionStats();
+ Range<Integer> mostRequestedFpsRange = Flags.analytics24q3()
+ ? cameraState.getMostRequestedFpsRange()
+ : new Range<Integer>(0, 0);
+
synchronized(mLock) {
// Update active camera list and notify NFC if necessary
boolean wasEmpty = mActiveCameraUsage.isEmpty();
@@ -1228,7 +1310,8 @@ public class CameraServiceProxy extends SystemService
oldEvent.markCompleted(/*internalReconfigure*/0, /*requestCount*/0,
/*resultErrorCount*/0, /*deviceError*/false, streamStats,
/*userTag*/"", /*videoStabilizationMode*/-1, /*usedUltraWide*/false,
- /*usedZoomOverride*/false, new CameraExtensionSessionStats());
+ /*usedZoomOverride*/false, new Range<Integer>(0, 0),
+ new CameraExtensionSessionStats());
mCameraUsageHistory.add(oldEvent);
}
break;
@@ -1240,7 +1323,7 @@ public class CameraServiceProxy extends SystemService
doneEvent.markCompleted(internalReconfigureCount, requestCount,
resultErrorCount, deviceError, streamStats, userTag,
videoStabilizationMode, usedUltraWide, usedZoomOverride,
- extSessionStats);
+ mostRequestedFpsRange, extSessionStats);
mCameraUsageHistory.add(doneEvent);
// Do not double count device error
deviceError = false;