summaryrefslogtreecommitdiff
path: root/src/com/android/devcamera/CameraDeviceReport.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/devcamera/CameraDeviceReport.java')
-rw-r--r--src/com/android/devcamera/CameraDeviceReport.java396
1 files changed, 396 insertions, 0 deletions
diff --git a/src/com/android/devcamera/CameraDeviceReport.java b/src/com/android/devcamera/CameraDeviceReport.java
new file mode 100644
index 0000000..ebd96ed
--- /dev/null
+++ b/src/com/android/devcamera/CameraDeviceReport.java
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.devcamera;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.os.Build;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.util.Range;
+import android.util.Size;
+import android.util.SizeF;
+import android.view.SurfaceHolder;
+import android.view.WindowManager;
+
+public class CameraDeviceReport {
+ private static final String TAG = "DevCamera_INFO";
+
+ // Note: we actually need the activity to get window information
+ public static void printReport(Activity activity, boolean firstCameraOnly) {
+ printDisplayInfo(activity);
+ printCameraSystemInfo(activity, firstCameraOnly);
+ }
+
+ /**
+ * Print out information about all cameras.
+ */
+ private static void printCameraSystemInfo(Activity activity, boolean firstCameraOnly) {
+ CameraManager cameraMgr = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); // "camera"
+ String[] cameralist;
+ try {
+ cameralist = cameraMgr.getCameraIdList();
+ Log.v(TAG, "Number of cameras:" + cameralist.length);
+ } catch (Exception e) {
+ Log.e(TAG, "Could not get camera ID list: "+e);
+ return;
+ }
+ for (String cameraId : cameralist) {
+ printCameraInfo(cameraMgr, cameraId);
+ if (firstCameraOnly) {
+ break;
+ }
+ }
+ }
+
+ /**
+ * Print out information about a specific camera.
+ */
+ private static void printCameraInfo(CameraManager manager, String id) {
+ Log.v(TAG, "============= CAMERA " + id + " INFO =============");
+
+ CameraCharacteristics p;
+ try {
+ p = manager.getCameraCharacteristics(id);
+ } catch (Exception e) {
+ Log.e(TAG, "Could not get getCameraCharacteristics");
+ return;
+ }
+ // dumpsys media.camera
+
+ // Print out various CameraCharacteristics.
+ Rect size = p.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+ if (size != null) {
+ Log.v(TAG, "SENSOR_INFO_ACTIVE_ARRAY_SIZE: "
+ + size.width() + "x" + size.height());
+ } else {
+ Log.v(TAG, "SENSOR_INFO_ACTIVE_ARRAY_SIZE: null");
+ }
+
+ Size size2 = p.get(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE);
+ Log.v(TAG, "SENSOR_INFO_PIXEL_ARRAY_SIZE: " + size2.getWidth() + "x" + size2.getHeight());
+
+ SizeF size3 = p.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);
+ Log.v(TAG, "SENSOR_INFO_PHYSICAL_SIZE: " + size3.getWidth() + "x" + size3.getHeight());
+
+
+ int sensorOrientation = p.get(CameraCharacteristics.SENSOR_ORIENTATION);
+ Log.v(TAG, "SENSOR_ORIENTATION: " + sensorOrientation);
+
+ Log.v(TAG, "SENSOR_INFO_TIMESTAMP_SOURCE: " +
+ getTimestampSourceName(p.get(CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE)));
+
+ Log.v(TAG, "LENS_INFO_FOCUS_DISTANCE_CALIBRATION: " +
+ getFocusDistanceCalibrationName(p.get(CameraCharacteristics.LENS_INFO_FOCUS_DISTANCE_CALIBRATION)));
+
+ int[] faceModes = p.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
+ Log.v(TAG, "STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES: ");
+ for (int i = 0; i < faceModes.length; i++) {
+ switch (faceModes[i]) {
+ case CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_OFF:
+ Log.v(TAG, " STATISTICS_FACE_DETECT_MODE_OFF");
+ break;
+ case CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_SIMPLE:
+ Log.v(TAG, " STATISTICS_FACE_DETECT_MODE_SIMPLE");
+ break;
+ case CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_FULL:
+ Log.v(TAG, " STATISTICS_FACE_DETECT_MODE_FULL");
+ break;
+ default:
+ Log.v(TAG, " STATISTICS_FACE_DETECT_MODE_? (unknown)");
+ }
+ }
+
+ Log.v(TAG, "STATISTICS_INFO_MAX_FACE_COUNT: " + p.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
+
+ Log.v(TAG, "REQUEST_PIPELINE_MAX_DEPTH: "
+ + p.get(CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH));
+
+ Log.v(TAG, "REQUEST_MAX_NUM_OUTPUT_RAW: "
+ + p.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_RAW));
+ Log.v(TAG, "REQUEST_MAX_NUM_OUTPUT_PROC: "
+ + p.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC));
+ Log.v(TAG, "REQUEST_MAX_NUM_OUTPUT_PROC_STALLING: "
+ + p.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC_STALLING));
+
+ Log.v(TAG, "EDGE_AVAILABLE_EDGE_MODES: "
+ + intsToString(p.get(CameraCharacteristics.EDGE_AVAILABLE_EDGE_MODES)));
+
+ Log.v(TAG, "NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES: "
+ + intsToString(p.get(CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES)));
+
+ Log.v(TAG, "REQUEST_MAX_NUM_OUTPUT_PROC_STALLING: "
+ + p.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC_STALLING));
+
+
+ // REQUEST_AVAILABLE_CAPABILITIES
+ boolean mHasReprocessing = false;
+ {
+ Log.v(TAG, "CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES:");
+ for (int item : p.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)) {
+ Log.v(TAG, " " + item + " = " + getCapabilityName(item));
+ if (item == 4 || item == 7) {
+ mHasReprocessing = true;
+ }
+ }
+ }
+
+ StreamConfigurationMap map = p.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ {
+ int[] formats = map.getOutputFormats();
+ Log.v(TAG, "number of output formats: " + formats.length);
+ for (int i = 0; i < formats.length; i++) {
+ Log.v(TAG, "output sizes for format " + formats[i] +
+ " = ImageFormat." + getFormatName(formats[i]) + " = " +
+ ImageFormat.getBitsPerPixel(formats[i]) + " bits per pixel.");
+ Size[] sizes = map.getOutputSizes(formats[i]);
+ if (sizes != null) {
+ Log.v(TAG, " Size Stall duration Min frame duration");
+ for (int j = 0; j < sizes.length; j++) {
+ Log.v(TAG, String.format(" %10s %7d ms %7d ms \n",
+ sizes[j].toString(),
+ map.getOutputStallDuration(formats[i], sizes[j]) / 1000000,
+ map.getOutputMinFrameDuration(formats[i], sizes[j]) / 1000000
+ ));
+ }
+ }
+ }
+ }
+
+ if (mHasReprocessing) {
+ int[] formats = map.getInputFormats();
+ Log.v(TAG, "number of input formats: " + formats.length);
+ for (int i = 0; i < formats.length; i++) {
+ Size[] sizes = map.getInputSizes(formats[i]);
+ Log.v(TAG, "input sizes for format " + formats[i] + " = ImageFormat."
+ + getFormatName(formats[i]) + " are: " + sizesToString(sizes));
+ }
+ }
+
+ {
+ Size[] sizes = map.getOutputSizes(SurfaceHolder.class);
+ Log.v(TAG, "output sizes for SurfaceHolder.class are: " + sizesToString(sizes));
+ }
+
+ {
+ Size[] sizes = map.getOutputSizes(SurfaceTexture.class);
+ Log.v(TAG, "output sizes for SurfaceTexture.class are: " + sizesToString(sizes));
+ }
+
+ // JPEG thumbnail sizes
+ {
+ Size[] sizes = p.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES);
+ Log.v(TAG, "JPEG thumbnail sizes: " + sizesToString(sizes));
+ }
+
+ // REQUEST HARDWARE LEVEL
+ {
+ int level = p.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+ Log.v(TAG, "CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL: " + getHardwareLevelName(level));
+ }
+
+
+ // REQUEST CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES
+ {
+ Log.v(TAG, "CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES:");
+ for (Range<Integer> item : p.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES)) {
+ Log.v(TAG, " " + item);
+ }
+ }
+ // SENSOR_INFO_EXPOSURE_TIME_RANGE
+ {
+ Range<Long> rr = p.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);
+ Log.v(TAG, "CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE: " + rr);
+ }
+
+
+ // CAPTURE REQUEST KEYS
+ {
+ String keys = "";
+ for (CaptureRequest.Key key : p.getAvailableCaptureRequestKeys()) {
+ keys += key.getName() + " ";
+ }
+ Log.v(TAG, "CameraCharacteristics.getAvailableCaptureRequestKeys() = " + keys);
+ }
+
+ // CAPTURE RESULT KEYS
+ {
+ String keys = "";
+ for (CaptureResult.Key key : p.getAvailableCaptureResultKeys()) {
+ keys += key.getName() + " ";
+ }
+ Log.v(TAG, "CameraCharacteristics.getAvailableCaptureResultKeys() = " + keys);
+ }
+
+ }
+
+ public static String sizesToString(Size[] sizes) {
+ String result = "";
+ if (sizes != null) {
+ for (int j = 0; j < sizes.length; j++) {
+ result += sizes[j].toString() + " ";
+ }
+ }
+ return result;
+ }
+
+ public static String intsToString(int[] modes) {
+ String result = "";
+ if (modes != null) {
+ for (int j = 0; j < modes.length; j++) {
+ result += modes[j] + " ";
+ }
+ }
+ return result;
+ }
+
+ public static String getTimestampSourceName(Integer level) {
+ if (level == null) return "null";
+ switch (level) {
+ case CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME:
+ return "SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME";
+ case CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN:
+ return "SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN";
+ }
+ return "Unknown";
+ }
+
+ public static String getFocusDistanceCalibrationName(Integer level) {
+ if (level == null) return "null";
+ switch (level) {
+ case CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE:
+ return "LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE";
+ case CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED:
+ return "LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED";
+ case CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED:
+ return "LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED";
+ }
+ return "Unknown";
+ }
+
+ public static String getCapabilityName(int format) {
+ switch (format) {
+ case CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:
+ return "REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE";
+ case CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
+ return "REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR";
+ case CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:
+ return "REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING";
+ case CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW:
+ return "REQUEST_AVAILABLE_CAPABILITIES_RAW";
+ case 4:
+ return "REQUEST_AVAILABLE_CAPABILITIES_OPAQUE_REPROCESSING";
+ case 5:
+ return "REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS";
+ case 6:
+ return "REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE";
+ case 7:
+ return "REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING";
+ case 8:
+ return "REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT";
+ }
+ return "Unknown";
+ }
+
+ public static String getHardwareLevelName(int level) {
+ switch (level) {
+ case CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
+ return "INFO_SUPPORTED_HARDWARE_LEVEL_FULL";
+ case CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
+ return "INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED";
+ case CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
+ return "INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY";
+ }
+ return "Unknown";
+ }
+
+
+ public static String getFormatName(int format) {
+ switch (format) {
+ // Android M
+ //case ImageFormat.PRIVATE:
+ // return "PRIVATE";
+ // Android L
+ case ImageFormat.JPEG:
+ return "JPEG";
+ case ImageFormat.RGB_565:
+ return "RGB_565";
+ case ImageFormat.NV16:
+ return "NV16";
+ case ImageFormat.YUY2:
+ return "YUY2";
+ case ImageFormat.YV12:
+ return "YV12";
+ case ImageFormat.NV21:
+ return "NV21";
+ case ImageFormat.YUV_420_888:
+ return "YUV_420_888";
+ case ImageFormat.RAW_SENSOR:
+ return "RAW_SENSOR";
+ case ImageFormat.RAW10:
+ return "RAW10";
+ }
+ return "Unknown";
+ }
+
+
+ /**
+ * Print out various information about the device display.
+ */
+ private static void printDisplayInfo(Activity activity) {
+ Log.v(TAG, "============= DEVICE INFO =============");
+ Log.v(TAG, "Build.DEVICE = " + Build.DEVICE);
+ Log.v(TAG, "Build.FINGERPRINT = " + Build.FINGERPRINT);
+ Log.v(TAG, "Build.BRAND = " + Build.BRAND);
+ Log.v(TAG, "Build.MODEL = " + Build.MODEL);
+ Log.v(TAG, "Build.PRODUCT = " + Build.PRODUCT);
+ Log.v(TAG, "Build.MANUFACTURER = " + Build.MANUFACTURER);
+ Log.v(TAG, "Build.VERSION.CODENAME = " + Build.VERSION.CODENAME);
+ Log.v(TAG, "Build.VERSION.SDK_INT = " + Build.VERSION.SDK_INT);
+
+ Log.v(TAG, "============= DEVICE DISPLAY INFO =============");
+ WindowManager windowMgr = activity.getWindowManager();
+
+ // Nexus 5 is 360dp * 567dp
+ // Each dp is 3 hardware pixels
+ Log.v(TAG, "screen width dp = " + activity.getResources().getConfiguration().screenWidthDp);
+ Log.v(TAG, "screen height dp = " + activity.getResources().getConfiguration().screenHeightDp);
+
+ DisplayMetrics metrics = new DisplayMetrics();
+ // With chrome subtracted.
+ windowMgr.getDefaultDisplay().getMetrics(metrics);
+ Log.v(TAG, "screen width pixels = " + metrics.widthPixels);
+ Log.v(TAG, "screen height pixels = " + metrics.heightPixels);
+ // Native.
+ windowMgr.getDefaultDisplay().getRealMetrics(metrics);
+ Log.v(TAG, "real screen width pixels = " + metrics.widthPixels);
+ Log.v(TAG, "real screen height pixels = " + metrics.heightPixels);
+
+ Log.v(TAG, "refresh rate = " + windowMgr.getDefaultDisplay().getRefreshRate() + " Hz");
+ }
+
+
+
+}