summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java3
-rw-r--r--services/core/java/com/android/server/camera/CameraServiceProxy.java497
-rw-r--r--services/core/java/com/android/server/camera/CameraStatsJobService.java7
3 files changed, 319 insertions, 188 deletions
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
index 8898a4c37446..df057a1489f0 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
@@ -105,7 +105,8 @@ public class CameraDeviceSetupImpl extends CameraDevice.CameraDeviceSetup {
try {
return cameraService.isSessionConfigurationWithParametersSupported(mCameraId,
- mTargetSdkVersion, config, mContext.getDeviceId(),
+ mTargetSdkVersion, config,
+ mContext.getDeviceId(),
mCameraManager.getDevicePolicyFromContext(mContext));
} catch (ServiceSpecificException e) {
throw ExceptionUtils.throwAsPublicException(e);
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 390ee96a3417..17835b2d085b 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -18,6 +18,10 @@ package com.android.server.camera;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.os.Build.VERSION_CODES.M;
+import static com.android.internal.util.FrameworkStatsLog.CAMERA_FEATURE_COMBINATION_QUERY_EVENT__STATUS_CODE__OK;
+import static com.android.internal.util.FrameworkStatsLog.CAMERA_FEATURE_COMBINATION_QUERY_EVENT__STATUS_CODE__ERROR_ILLEGAL_ARGUMENT;
+import static com.android.internal.util.FrameworkStatsLog.CAMERA_FEATURE_COMBINATION_QUERY_EVENT__STATUS_CODE__ERROR_INVALID_OPERATION;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -40,6 +44,7 @@ import android.content.res.Configuration;
import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.hardware.CameraExtensionSessionStats;
+import android.hardware.CameraFeatureCombinationStats;
import android.hardware.CameraSessionStats;
import android.hardware.CameraStreamStats;
import android.hardware.ICameraService;
@@ -217,7 +222,7 @@ public class CameraServiceProxy extends SystemService
// Map of currently active camera IDs
private final ArrayMap<String, CameraUsageEvent> mActiveCameraUsage = new ArrayMap<>();
- private final List<CameraUsageEvent> mCameraUsageHistory = new ArrayList<>();
+ private final List<CameraEvent> mCameraEventHistory = new ArrayList<CameraEvent>();
private static final String NFC_NOTIFICATION_PROP = "ro.camera.notify_nfc";
private static final IBinder nfcInterfaceToken = new Binder();
@@ -228,9 +233,16 @@ public class CameraServiceProxy extends SystemService
/*corePoolSize*/ 1);
/**
+ * Interface to track camera analytics
+ */
+ private interface CameraEvent {
+ void logSelf();
+ }
+
+ /**
* Structure to track camera usage
*/
- private static class CameraUsageEvent {
+ private static class CameraUsageEvent implements CameraEvent {
public final String mCameraId;
public final int mCameraFacing;
public final String mClientName;
@@ -311,6 +323,214 @@ public class CameraServiceProxy extends SystemService
public long getDuration() {
return mCompleted ? mDurationOrStartTimeMs : 0;
}
+
+ public void logSelf() {
+ int facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__UNKNOWN;
+ switch(mCameraFacing) {
+ case CameraSessionStats.CAMERA_FACING_BACK:
+ facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__BACK;
+ break;
+ case CameraSessionStats.CAMERA_FACING_FRONT:
+ facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__FRONT;
+ break;
+ case CameraSessionStats.CAMERA_FACING_EXTERNAL:
+ facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__EXTERNAL;
+ break;
+ default:
+ Slog.w(TAG, "Unknown camera facing: " + mCameraFacing);
+ }
+
+ int extensionType = FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_NONE;
+ boolean extensionIsAdvanced = false;
+ int extensionCaptureFormat = ImageFormat.UNKNOWN;
+ if (mExtSessionStats != null) {
+ switch (mExtSessionStats.type) {
+ case CameraExtensionSessionStats.Type.EXTENSION_AUTOMATIC:
+ extensionType = FrameworkStatsLog
+ .CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_AUTOMATIC;
+ break;
+ case CameraExtensionSessionStats.Type.EXTENSION_FACE_RETOUCH:
+ extensionType = FrameworkStatsLog
+ .CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_FACE_RETOUCH;
+ break;
+ case CameraExtensionSessionStats.Type.EXTENSION_BOKEH:
+ extensionType =
+ FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_BOKEH;
+ break;
+ case CameraExtensionSessionStats.Type.EXTENSION_HDR:
+ extensionType =
+ FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_HDR;
+ break;
+ case CameraExtensionSessionStats.Type.EXTENSION_NIGHT:
+ extensionType =
+ FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_NIGHT;
+ break;
+ default:
+ Slog.w(TAG, "Unknown extension type: " + mExtSessionStats.type);
+ }
+ extensionIsAdvanced = mExtSessionStats.isAdvanced;
+ if (Flags.analytics24q3()) {
+ extensionCaptureFormat = mExtSessionStats.captureFormat;
+ }
+ }
+
+ int streamCount = 0;
+ if (mStreamStats != null) {
+ streamCount = mStreamStats.size();
+ }
+ if (CameraServiceProxy.DEBUG) {
+ String ultrawideDebug = Flags.logUltrawideUsage()
+ ? ", wideAngleUsage " + mUsedUltraWide
+ : "";
+ String zoomOverrideDebug = Flags.logZoomOverrideUsage()
+ ? ", zoomOverrideUsage " + mUsedZoomOverride
+ : "";
+ String mostRequestedFpsRangeDebug = Flags.analytics24q3()
+ ? ", mostRequestedFpsRange " + mMostRequestedFpsRange
+ : "";
+ String extensionCaptureFormatDebug = Flags.analytics24q3()
+ ? " extensionCaptureFormat " + mExtSessionStats.captureFormat
+ : "";
+
+ Slog.v(TAG, "CAMERA_ACTION_EVENT: action " + mAction
+ + " clientName " + mClientName
+ + ", duration " + getDuration()
+ + ", APILevel " + mAPILevel
+ + ", cameraId " + mCameraId
+ + ", facing " + facing
+ + ", isNdk " + mIsNdk
+ + ", latencyMs " + mLatencyMs
+ + ", operatingMode " + mOperatingMode
+ + ", internalReconfigure " + mInternalReconfigure
+ + ", requestCount " + mRequestCount
+ + ", resultErrorCount " + mResultErrorCount
+ + ", deviceError " + mDeviceError
+ + ", streamCount is " + streamCount
+ + ", userTag is " + mUserTag
+ + ", videoStabilizationMode " + mVideoStabilizationMode
+ + ultrawideDebug
+ + zoomOverrideDebug
+ + mostRequestedFpsRangeDebug
+ + ", logId " + mLogId
+ + ", sessionIndex " + mSessionIndex
+ + ", mExtSessionStats {type " + extensionType
+ + " isAdvanced " + extensionIsAdvanced
+ + extensionCaptureFormatDebug + "}");
+ }
+
+ // Convert from CameraStreamStats to CameraStreamProto
+ CameraStreamProto[] streamProtos = new CameraStreamProto[MAX_STREAM_STATISTICS];
+ for (int i = 0; i < MAX_STREAM_STATISTICS; i++) {
+ streamProtos[i] = new CameraStreamProto();
+ if (i < streamCount) {
+ CameraStreamStats streamStats = mStreamStats.get(i);
+ streamProtos[i].width = streamStats.getWidth();
+ streamProtos[i].height = streamStats.getHeight();
+ streamProtos[i].format = streamStats.getFormat();
+ streamProtos[i].dataSpace = streamStats.getDataSpace();
+ streamProtos[i].usage = streamStats.getUsage();
+ streamProtos[i].requestCount = streamStats.getRequestCount();
+ streamProtos[i].errorCount = streamStats.getErrorCount();
+ streamProtos[i].firstCaptureLatencyMillis = streamStats.getStartLatencyMs();
+ streamProtos[i].maxHalBuffers = streamStats.getMaxHalBuffers();
+ streamProtos[i].maxAppBuffers = streamStats.getMaxAppBuffers();
+ streamProtos[i].histogramType = streamStats.getHistogramType();
+ streamProtos[i].histogramBins = streamStats.getHistogramBins();
+ streamProtos[i].histogramCounts = streamStats.getHistogramCounts();
+ streamProtos[i].dynamicRangeProfile = streamStats.getDynamicRangeProfile();
+ streamProtos[i].streamUseCase = streamStats.getStreamUseCase();
+ streamProtos[i].colorSpace = streamStats.getColorSpace();
+
+ if (CameraServiceProxy.DEBUG) {
+ String histogramTypeName =
+ cameraHistogramTypeToString(streamProtos[i].histogramType);
+ 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
+ + ", errorCount " + streamProtos[i].errorCount
+ + ", firstCaptureLatencyMillis "
+ + streamProtos[i].firstCaptureLatencyMillis
+ + ", maxHalBuffers " + streamProtos[i].maxHalBuffers
+ + ", maxAppBuffers " + streamProtos[i].maxAppBuffers
+ + ", histogramType " + histogramTypeName
+ + ", histogramBins "
+ + Arrays.toString(streamProtos[i].histogramBins)
+ + ", histogramCounts "
+ + Arrays.toString(streamProtos[i].histogramCounts)
+ + ", dynamicRangeProfile " + streamProtos[i].dynamicRangeProfile
+ + ", streamUseCase " + streamProtos[i].streamUseCase
+ + ", colorSpace " + streamProtos[i].colorSpace);
+ }
+ }
+ }
+ FrameworkStatsLog.write(FrameworkStatsLog.CAMERA_ACTION_EVENT, getDuration(),
+ mAPILevel, mClientName, facing, mCameraId, mAction, mIsNdk,
+ mLatencyMs, mOperatingMode, mInternalReconfigure,
+ mRequestCount, mResultErrorCount, mDeviceError,
+ streamCount, MessageNano.toByteArray(streamProtos[0]),
+ MessageNano.toByteArray(streamProtos[1]),
+ MessageNano.toByteArray(streamProtos[2]),
+ MessageNano.toByteArray(streamProtos[3]),
+ MessageNano.toByteArray(streamProtos[4]),
+ mUserTag, mVideoStabilizationMode,
+ mLogId, mSessionIndex,
+ extensionType, extensionIsAdvanced, mUsedUltraWide,
+ mUsedZoomOverride,
+ mMostRequestedFpsRange.getLower(), mMostRequestedFpsRange.getUpper(),
+ extensionCaptureFormat);
+
+ }
+ }
+ /**
+ * Structure to track feature combination query
+ */
+ private static class CameraFeatureCombinationQueryEvent implements CameraEvent {
+ private CameraFeatureCombinationStats mFeatureCombinationStats;
+
+ CameraFeatureCombinationQueryEvent(CameraFeatureCombinationStats featureCombinationStats) {
+ mFeatureCombinationStats = featureCombinationStats;
+ }
+
+ public void logSelf() {
+ int statusCode = -1;
+ switch (mFeatureCombinationStats.mStatus) {
+ case 0:
+ statusCode = CAMERA_FEATURE_COMBINATION_QUERY_EVENT__STATUS_CODE__OK;
+ break;
+ case ICameraService.ERROR_ILLEGAL_ARGUMENT:
+ statusCode = CAMERA_FEATURE_COMBINATION_QUERY_EVENT__STATUS_CODE__ERROR_ILLEGAL_ARGUMENT;
+ break;
+ case ICameraService.ERROR_INVALID_OPERATION:
+ statusCode = CAMERA_FEATURE_COMBINATION_QUERY_EVENT__STATUS_CODE__ERROR_INVALID_OPERATION;
+ break;
+ default:
+ break;
+ }
+ if (statusCode == -1) {
+ Slog.w(TAG, "Unknown feature combination query status code: "
+ + mFeatureCombinationStats.mStatus);
+ return;
+ }
+
+ if (CameraServiceProxy.DEBUG) {
+ Slog.v(TAG, "CAMERA_FEATURE_COMBINATION_QUERY_EVENT: uid "
+ + mFeatureCombinationStats.mUid
+ + ", cameraId " + mFeatureCombinationStats.mCameraId
+ + ", queryType " + mFeatureCombinationStats.mQueryType
+ + ", featureCombination " + mFeatureCombinationStats.mFeatureCombination
+ + ", status " + statusCode);
+ }
+ FrameworkStatsLog.write(FrameworkStatsLog.CAMERA_FEATURE_COMBINATION_QUERY_EVENT,
+ mFeatureCombinationStats.mUid,
+ mFeatureCombinationStats.mCameraId,
+ mFeatureCombinationStats.mQueryType,
+ mFeatureCombinationStats.mFeatureCombination,
+ statusCode);
+ }
}
private final class DisplayWindowListener extends IDisplayWindowListener.Stub {
@@ -625,6 +845,32 @@ public class CameraServiceProxy extends SystemService
}
@Override
+ public void notifyFeatureCombinationStats(CameraFeatureCombinationStats featureCombStats) {
+ if (!Flags.analytics24q3()) {
+ return;
+ }
+ if (Binder.getCallingUid() != Process.CAMERASERVER_UID) {
+ Slog.e(TAG, "Calling UID: " + Binder.getCallingUid() + " doesn't match expected "
+ + " camera service UID!");
+ return;
+ }
+
+ if (DEBUG) {
+ String combinationTypeStr = cameraFeatureCombinationTypeToString(
+ featureCombStats.mQueryType);
+ String combinationStr = cameraFeatureCombinationToString(
+ featureCombStats.mFeatureCombination);
+ Slog.v(TAG, "Camera " + featureCombStats.mCameraId
+ + " query " + combinationTypeStr
+ + " combination " + combinationStr
+ + " for client UID " + featureCombStats.mUid
+ + " returns " + featureCombStats.mStatus);
+ }
+
+ updateFeatureCombinationQuery(featureCombStats);
+ }
+
+ @Override
public boolean isCameraDisabled(int userId) {
if (Binder.getCallingUid() != Process.CAMERASERVER_UID) {
Slog.e(TAG, "Calling UID: " + Binder.getCallingUid()
@@ -684,7 +930,7 @@ public class CameraServiceProxy extends SystemService
switch (cmd.replace('-', '_')) {
case "dump_events":
int eventCount = mCameraServiceProxy.getUsageEventCount();
- mCameraServiceProxy.dumpUsageEvents();
+ mCameraServiceProxy.dumpCameraEvents();
pw.println("Camera usage events dumped: " + eventCount);
break;
default:
@@ -865,18 +1111,18 @@ public class CameraServiceProxy extends SystemService
}
private class EventWriterTask implements Runnable {
- private ArrayList<CameraUsageEvent> mEventList;
+ private List<CameraEvent> mEventList;
private static final long WRITER_SLEEP_MS = 100;
- public EventWriterTask(ArrayList<CameraUsageEvent> eventList) {
+ EventWriterTask(List<CameraEvent> eventList) {
mEventList = eventList;
}
@Override
public void run() {
if (mEventList != null) {
- for (CameraUsageEvent event : mEventList) {
- logCameraUsageEvent(event);
+ for (CameraEvent event : mEventList) {
+ event.logSelf();
try {
Thread.sleep(WRITER_SLEEP_MS);
} catch (InterruptedException e) {}
@@ -884,170 +1130,6 @@ public class CameraServiceProxy extends SystemService
mEventList.clear();
}
}
-
- /**
- * Write camera usage events to stats log.
- * Package-private
- */
- private void logCameraUsageEvent(CameraUsageEvent e) {
- int facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__UNKNOWN;
- switch(e.mCameraFacing) {
- case CameraSessionStats.CAMERA_FACING_BACK:
- facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__BACK;
- break;
- case CameraSessionStats.CAMERA_FACING_FRONT:
- facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__FRONT;
- break;
- case CameraSessionStats.CAMERA_FACING_EXTERNAL:
- facing = FrameworkStatsLog.CAMERA_ACTION_EVENT__FACING__EXTERNAL;
- break;
- default:
- Slog.w(TAG, "Unknown camera facing: " + e.mCameraFacing);
- }
-
- int extensionType = FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_NONE;
- boolean extensionIsAdvanced = false;
- int extensionCaptureFormat = ImageFormat.UNKNOWN;
- if (e.mExtSessionStats != null) {
- switch (e.mExtSessionStats.type) {
- case CameraExtensionSessionStats.Type.EXTENSION_AUTOMATIC:
- extensionType = FrameworkStatsLog
- .CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_AUTOMATIC;
- break;
- case CameraExtensionSessionStats.Type.EXTENSION_FACE_RETOUCH:
- extensionType = FrameworkStatsLog
- .CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_FACE_RETOUCH;
- break;
- case CameraExtensionSessionStats.Type.EXTENSION_BOKEH:
- extensionType =
- FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_BOKEH;
- break;
- case CameraExtensionSessionStats.Type.EXTENSION_HDR:
- extensionType =
- FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_HDR;
- break;
- case CameraExtensionSessionStats.Type.EXTENSION_NIGHT:
- extensionType =
- FrameworkStatsLog.CAMERA_ACTION_EVENT__EXT_TYPE__EXTENSION_NIGHT;
- break;
- default:
- Slog.w(TAG, "Unknown extension type: " + e.mExtSessionStats.type);
- }
- extensionIsAdvanced = e.mExtSessionStats.isAdvanced;
- if (Flags.analytics24q3()) {
- extensionCaptureFormat = e.mExtSessionStats.captureFormat;
- }
- }
-
- int streamCount = 0;
- if (e.mStreamStats != null) {
- streamCount = e.mStreamStats.size();
- }
- if (CameraServiceProxy.DEBUG) {
- String ultrawideDebug = Flags.logUltrawideUsage()
- ? ", wideAngleUsage " + e.mUsedUltraWide
- : "";
- String zoomOverrideDebug = Flags.logZoomOverrideUsage()
- ? ", zoomOverrideUsage " + e.mUsedZoomOverride
- : "";
- String mostRequestedFpsRangeDebug = Flags.analytics24q3()
- ? ", mostRequestedFpsRange " + e.mMostRequestedFpsRange
- : "";
- String extensionCaptureFormatDebug = Flags.analytics24q3()
- ? " extensionCaptureFormat " + e.mExtSessionStats.captureFormat
- : "";
-
- Slog.v(TAG, "CAMERA_ACTION_EVENT: action " + e.mAction
- + " clientName " + e.mClientName
- + ", duration " + e.getDuration()
- + ", APILevel " + e.mAPILevel
- + ", cameraId " + e.mCameraId
- + ", facing " + facing
- + ", isNdk " + e.mIsNdk
- + ", latencyMs " + e.mLatencyMs
- + ", operatingMode " + e.mOperatingMode
- + ", internalReconfigure " + e.mInternalReconfigure
- + ", requestCount " + e.mRequestCount
- + ", resultErrorCount " + e.mResultErrorCount
- + ", deviceError " + e.mDeviceError
- + ", streamCount is " + streamCount
- + ", userTag is " + e.mUserTag
- + ", videoStabilizationMode " + e.mVideoStabilizationMode
- + ultrawideDebug
- + zoomOverrideDebug
- + mostRequestedFpsRangeDebug
- + ", logId " + e.mLogId
- + ", sessionIndex " + e.mSessionIndex
- + ", mExtSessionStats {type " + extensionType
- + " isAdvanced " + extensionIsAdvanced
- + extensionCaptureFormatDebug + "}");
- }
-
- // Convert from CameraStreamStats to CameraStreamProto
- CameraStreamProto[] streamProtos = new CameraStreamProto[MAX_STREAM_STATISTICS];
- for (int i = 0; i < MAX_STREAM_STATISTICS; i++) {
- streamProtos[i] = new CameraStreamProto();
- if (i < streamCount) {
- CameraStreamStats streamStats = e.mStreamStats.get(i);
- streamProtos[i].width = streamStats.getWidth();
- streamProtos[i].height = streamStats.getHeight();
- streamProtos[i].format = streamStats.getFormat();
- streamProtos[i].dataSpace = streamStats.getDataSpace();
- streamProtos[i].usage = streamStats.getUsage();
- streamProtos[i].requestCount = streamStats.getRequestCount();
- streamProtos[i].errorCount = streamStats.getErrorCount();
- streamProtos[i].firstCaptureLatencyMillis = streamStats.getStartLatencyMs();
- streamProtos[i].maxHalBuffers = streamStats.getMaxHalBuffers();
- streamProtos[i].maxAppBuffers = streamStats.getMaxAppBuffers();
- streamProtos[i].histogramType = streamStats.getHistogramType();
- streamProtos[i].histogramBins = streamStats.getHistogramBins();
- streamProtos[i].histogramCounts = streamStats.getHistogramCounts();
- streamProtos[i].dynamicRangeProfile = streamStats.getDynamicRangeProfile();
- streamProtos[i].streamUseCase = streamStats.getStreamUseCase();
- streamProtos[i].colorSpace = streamStats.getColorSpace();
-
- if (CameraServiceProxy.DEBUG) {
- String histogramTypeName =
- cameraHistogramTypeToString(streamProtos[i].histogramType);
- 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
- + ", errorCount " + streamProtos[i].errorCount
- + ", firstCaptureLatencyMillis "
- + streamProtos[i].firstCaptureLatencyMillis
- + ", maxHalBuffers " + streamProtos[i].maxHalBuffers
- + ", maxAppBuffers " + streamProtos[i].maxAppBuffers
- + ", histogramType " + histogramTypeName
- + ", histogramBins "
- + Arrays.toString(streamProtos[i].histogramBins)
- + ", histogramCounts "
- + Arrays.toString(streamProtos[i].histogramCounts)
- + ", dynamicRangeProfile " + streamProtos[i].dynamicRangeProfile
- + ", streamUseCase " + streamProtos[i].streamUseCase
- + ", colorSpace " + streamProtos[i].colorSpace);
- }
- }
- }
- FrameworkStatsLog.write(FrameworkStatsLog.CAMERA_ACTION_EVENT, e.getDuration(),
- e.mAPILevel, e.mClientName, facing, e.mCameraId, e.mAction, e.mIsNdk,
- e.mLatencyMs, e.mOperatingMode, e.mInternalReconfigure,
- e.mRequestCount, e.mResultErrorCount, e.mDeviceError,
- streamCount, MessageNano.toByteArray(streamProtos[0]),
- MessageNano.toByteArray(streamProtos[1]),
- MessageNano.toByteArray(streamProtos[2]),
- MessageNano.toByteArray(streamProtos[3]),
- MessageNano.toByteArray(streamProtos[4]),
- e.mUserTag, e.mVideoStabilizationMode,
- e.mLogId, e.mSessionIndex,
- extensionType, extensionIsAdvanced, e.mUsedUltraWide,
- e.mUsedZoomOverride,
- e.mMostRequestedFpsRange.getLower(), e.mMostRequestedFpsRange.getUpper(),
- extensionCaptureFormat);
- }
}
/**
@@ -1055,22 +1137,22 @@ public class CameraServiceProxy extends SystemService
*/
int getUsageEventCount() {
synchronized (mLock) {
- return mCameraUsageHistory.size();
+ return mCameraEventHistory.size();
}
}
/**
- * Dump camera usage events to log.
+ * Dump camera events to log.
* Package-private
*/
- void dumpUsageEvents() {
+ void dumpCameraEvents() {
synchronized(mLock) {
// Randomize order of events so that it's not meaningful
- Collections.shuffle(mCameraUsageHistory);
+ Collections.shuffle(mCameraEventHistory);
mLogWriterService.execute(new EventWriterTask(
- new ArrayList<CameraUsageEvent>(mCameraUsageHistory)));
+ new ArrayList(mCameraEventHistory)));
- mCameraUsageHistory.clear();
+ mCameraEventHistory.clear();
}
final long ident = Binder.clearCallingIdentity();
try {
@@ -1288,7 +1370,7 @@ public class CameraServiceProxy extends SystemService
cameraId, facing, clientName, apiLevel, isNdk,
FrameworkStatsLog.CAMERA_ACTION_EVENT__ACTION__OPEN,
latencyMs, sessionType, deviceError, logId, sessionIdx);
- mCameraUsageHistory.add(openEvent);
+ mCameraEventHistory.add(openEvent);
break;
case CameraSessionStats.CAMERA_STATE_ACTIVE:
// Check current active camera IDs to see if this package is already talking to
@@ -1323,7 +1405,7 @@ public class CameraServiceProxy extends SystemService
/*userTag*/"", /*videoStabilizationMode*/-1, /*usedUltraWide*/false,
/*usedZoomOverride*/false, new Range<Integer>(0, 0),
new CameraExtensionSessionStats());
- mCameraUsageHistory.add(oldEvent);
+ mCameraEventHistory.add(oldEvent);
}
break;
case CameraSessionStats.CAMERA_STATE_IDLE:
@@ -1335,7 +1417,7 @@ public class CameraServiceProxy extends SystemService
resultErrorCount, deviceError, streamStats, userTag,
videoStabilizationMode, usedUltraWide, usedZoomOverride,
mostRequestedFpsRange, extSessionStats);
- mCameraUsageHistory.add(doneEvent);
+ mCameraEventHistory.add(doneEvent);
// Do not double count device error
deviceError = false;
@@ -1362,11 +1444,11 @@ public class CameraServiceProxy extends SystemService
cameraId, facing, clientName, apiLevel, isNdk,
FrameworkStatsLog.CAMERA_ACTION_EVENT__ACTION__CLOSE,
latencyMs, sessionType, deviceError, logId, sessionIdx);
- mCameraUsageHistory.add(closeEvent);
+ mCameraEventHistory.add(closeEvent);
}
- if (mCameraUsageHistory.size() > MAX_USAGE_HISTORY) {
- dumpUsageEvents();
+ if (mCameraEventHistory.size() > MAX_USAGE_HISTORY) {
+ dumpCameraEvents();
}
break;
@@ -1378,6 +1460,18 @@ public class CameraServiceProxy extends SystemService
}
}
+ private void updateFeatureCombinationQuery(CameraFeatureCombinationStats featureCombStats) {
+ synchronized (mLock) {
+ CameraFeatureCombinationQueryEvent e =
+ new CameraFeatureCombinationQueryEvent(featureCombStats);
+ mCameraEventHistory.add(e);
+
+ if (mCameraEventHistory.size() > MAX_USAGE_HISTORY) {
+ dumpCameraEvents();
+ }
+ }
+ }
+
private void notifyNfcService(boolean enablePolling) {
NfcManager nfcManager = mContext.getSystemService(NfcManager.class);
if (nfcManager == null) {
@@ -1434,4 +1528,41 @@ public class CameraServiceProxy extends SystemService
return "HISTOGRAM_TYPE_UNKNOWN";
}
+ private static String cameraFeatureCombinationTypeToString(int featureCombinationType) {
+ switch (featureCombinationType) {
+ case CameraFeatureCombinationStats.QueryType.QUERY_FEATURE_COMBINATION:
+ return "QUERY_FEATURE_COMBINATION";
+ case CameraFeatureCombinationStats.QueryType.QUERY_SESSION_CHARACTERISTICS:
+ return "QUERY_SESSION_CHARACTERISTICS";
+ default:
+ break;
+ }
+ return "FEATURE_COMBINATION_TYPE_UNKNOWN";
+ }
+
+ private static String cameraFeatureCombinationToString(long featureCombination) {
+ StringBuilder combinationStr = new StringBuilder("{");
+ if ((featureCombination & CameraFeatureCombinationStats.CAMERA_FEATURE_60_FPS) != 0) {
+ combinationStr.append("60fps ");
+ }
+ if ((featureCombination & CameraFeatureCombinationStats.CAMERA_FEATURE_STABILIZATION)
+ != 0) {
+ combinationStr.append("stabilization ");
+ }
+ if ((featureCombination & CameraFeatureCombinationStats.CAMERA_FEATURE_HLG10) != 0) {
+ combinationStr.append("hlg10 ");
+ }
+ if ((featureCombination & CameraFeatureCombinationStats.CAMERA_FEATURE_JPEG) != 0) {
+ combinationStr.append("jpeg ");
+ }
+ if ((featureCombination & CameraFeatureCombinationStats.CAMERA_FEATURE_JPEG_R) != 0) {
+ combinationStr.append("jpeg_r ");
+ }
+ if ((featureCombination & CameraFeatureCombinationStats.CAMERA_FEATURE_4K) != 0) {
+ combinationStr.append("4k ");
+ }
+ combinationStr.append("}");
+
+ return combinationStr.toString();
+ }
}
diff --git a/services/core/java/com/android/server/camera/CameraStatsJobService.java b/services/core/java/com/android/server/camera/CameraStatsJobService.java
index b8a6846ced76..1227ca7ef057 100644
--- a/services/core/java/com/android/server/camera/CameraStatsJobService.java
+++ b/services/core/java/com/android/server/camera/CameraStatsJobService.java
@@ -21,14 +21,13 @@ import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
import android.util.Slog;
-import java.util.concurrent.TimeUnit;
-
import com.android.server.LocalServices;
+import java.util.concurrent.TimeUnit;
+
/**
* A JobService to periodically collect camera usage stats.
*/
@@ -50,7 +49,7 @@ public class CameraStatsJobService extends JobService {
return false;
}
- serviceProxy.dumpUsageEvents();
+ serviceProxy.dumpCameraEvents();
return false;
}