|
36 | 36 | import android.util.Log; |
37 | 37 | import android.util.Range; |
38 | 38 | import android.util.Size; |
| 39 | +import android.util.SizeF; |
39 | 40 |
|
40 | 41 | import java.util.ArrayList; |
41 | 42 | import java.util.Arrays; |
@@ -187,10 +188,6 @@ private static void mapCharacteristicsFromParameters(CameraMetadataNative m, |
187 | 188 | */ |
188 | 189 | mapFlash(m, p); |
189 | 190 |
|
190 | | - /* |
191 | | - * request.* |
192 | | - */ |
193 | | - mapRequest(m, p); |
194 | 191 | // TODO: map other fields |
195 | 192 |
|
196 | 193 | /* |
@@ -223,6 +220,13 @@ private static void mapCharacteristicsFromParameters(CameraMetadataNative m, |
223 | 220 | */ |
224 | 221 | mapScalerStreamConfigs(m, p); |
225 | 222 |
|
| 223 | + // Order matters below: Put this last so that we can read the metadata set previously |
| 224 | + |
| 225 | + /* |
| 226 | + * request.* |
| 227 | + */ |
| 228 | + mapRequest(m, p); |
| 229 | + |
226 | 230 | } |
227 | 231 |
|
228 | 232 | private static void mapScalerStreamConfigs(CameraMetadataNative m, Camera.Parameters p) { |
@@ -535,21 +539,40 @@ private static void mapControlOther(CameraMetadataNative m, Camera.Parameters p) |
535 | 539 | * android.control.availableSceneModes |
536 | 540 | */ |
537 | 541 | List<String> sceneModes = p.getSupportedSceneModes(); |
538 | | - int[] supportedSceneModes = (sceneModes == null) ? new int[0] : |
539 | | - ArrayUtils.convertStringListToIntArray(sceneModes, sLegacySceneModes, sSceneModes); |
540 | | - m.set(CONTROL_AVAILABLE_SCENE_MODES, supportedSceneModes); |
| 542 | + List<Integer> supportedSceneModes = |
| 543 | + ArrayUtils.convertStringListToIntList(sceneModes, sLegacySceneModes, sSceneModes); |
| 544 | + if (supportedSceneModes == null) { // camera1 doesn't support scene mode settings |
| 545 | + supportedSceneModes = new ArrayList<Integer>(); |
| 546 | + supportedSceneModes.add(CONTROL_SCENE_MODE_DISABLED); // disabled is always available |
| 547 | + } |
| 548 | + if (p.getMaxNumDetectedFaces() > 0) { // always supports FACE_PRIORITY when face detecting |
| 549 | + supportedSceneModes.add(CONTROL_SCENE_MODE_FACE_PRIORITY); |
| 550 | + } |
| 551 | + m.set(CONTROL_AVAILABLE_SCENE_MODES, ArrayUtils.toIntArray(supportedSceneModes)); |
541 | 552 | } |
542 | 553 |
|
543 | 554 | private static void mapLens(CameraMetadataNative m, Camera.Parameters p) { |
544 | 555 | /* |
545 | 556 | * We can tell if the lens is fixed focus; |
546 | 557 | * but if it's not, we can't tell the minimum focus distance, so leave it null then. |
547 | 558 | */ |
548 | | - if (p.getFocusMode() == Camera.Parameters.FOCUS_MODE_FIXED) { |
| 559 | + if (VERBOSE) { |
| 560 | + Log.v(TAG, "mapLens - focus-mode='" + p.getFocusMode() + "'"); |
| 561 | + } |
| 562 | + |
| 563 | + if (Camera.Parameters.FOCUS_MODE_FIXED.equals(p.getFocusMode())) { |
549 | 564 | /* |
550 | 565 | * lens.info.minimumFocusDistance |
551 | 566 | */ |
552 | 567 | m.set(LENS_INFO_MINIMUM_FOCUS_DISTANCE, LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS); |
| 568 | + |
| 569 | + if (VERBOSE) { |
| 570 | + Log.v(TAG, "mapLens - lens.info.minimumFocusDistance = 0"); |
| 571 | + } |
| 572 | + } else { |
| 573 | + if (VERBOSE) { |
| 574 | + Log.v(TAG, "mapLens - lens.info.minimumFocusDistance is unknown"); |
| 575 | + } |
553 | 576 | } |
554 | 577 |
|
555 | 578 | float[] focalLengths = new float[] { p.getFocalLength() }; |
@@ -620,7 +643,17 @@ private static void mapRequest(CameraMetadataNative m, Parameters p) { |
620 | 643 | CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT , |
621 | 644 | CameraCharacteristics.SYNC_MAX_LATENCY , |
622 | 645 | }; |
623 | | - m.set(REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, getTagsForKeys(availableKeys)); |
| 646 | + List<Key<?>> characteristicsKeys = new ArrayList<>(Arrays.asList(availableKeys)); |
| 647 | + |
| 648 | + /* |
| 649 | + * Add the conditional keys |
| 650 | + */ |
| 651 | + if (m.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE) != null) { |
| 652 | + characteristicsKeys.add(LENS_INFO_MINIMUM_FOCUS_DISTANCE); |
| 653 | + } |
| 654 | + |
| 655 | + m.set(REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, |
| 656 | + getTagsForKeys(characteristicsKeys.toArray(new Key<?>[0]))); |
624 | 657 | } |
625 | 658 |
|
626 | 659 | /* |
@@ -757,6 +790,23 @@ private static void mapSensor(CameraMetadataNative m, Parameters p) { |
757 | 790 | * sensor.info.pixelArraySize |
758 | 791 | */ |
759 | 792 | m.set(SENSOR_INFO_PIXEL_ARRAY_SIZE, largestJpegSize); |
| 793 | + |
| 794 | + /* |
| 795 | + * sensor.info.physicalSize |
| 796 | + */ |
| 797 | + { |
| 798 | + /* |
| 799 | + * Assume focal length is at infinity focus and that the lens is rectilinear. |
| 800 | + */ |
| 801 | + float focalLength = p.getFocalLength(); // in mm |
| 802 | + double angleHor = p.getHorizontalViewAngle() * Math.PI / 180; // to radians |
| 803 | + double angleVer = p.getVerticalViewAngle() * Math.PI / 180; // to radians |
| 804 | + |
| 805 | + float height = (float)Math.abs(2 * focalLength * Math.tan(angleVer / 2)); |
| 806 | + float width = (float)Math.abs(2 * focalLength * Math.tan(angleHor / 2)); |
| 807 | + |
| 808 | + m.set(SENSOR_INFO_PHYSICAL_SIZE, new SizeF(width, height)); // in mm |
| 809 | + } |
760 | 810 | } |
761 | 811 |
|
762 | 812 | private static void mapStatistics(CameraMetadataNative m, Parameters p) { |
@@ -850,6 +900,11 @@ static int convertSceneModeFromLegacy(String mode) { |
850 | 900 | } |
851 | 901 |
|
852 | 902 | static String convertSceneModeToLegacy(int mode) { |
| 903 | + if (mode == CONTROL_SCENE_MODE_FACE_PRIORITY) { |
| 904 | + // OK: Let LegacyFaceDetectMapper handle turning face detection on/off |
| 905 | + return Parameters.SCENE_MODE_AUTO; |
| 906 | + } |
| 907 | + |
853 | 908 | int index = ArrayUtils.getArrayIndex(sSceneModes, mode); |
854 | 909 | if (index < 0) { |
855 | 910 | return null; |
@@ -1057,7 +1112,24 @@ public static CameraMetadataNative createRequestTemplate( |
1057 | 1112 | } |
1058 | 1113 |
|
1059 | 1114 | // control.captureIntent |
1060 | | - m.set(CaptureRequest.CONTROL_CAPTURE_INTENT, templateId); |
| 1115 | + { |
| 1116 | + int captureIntent; |
| 1117 | + switch (templateId) { |
| 1118 | + case CameraDevice.TEMPLATE_PREVIEW: |
| 1119 | + captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; |
| 1120 | + break; |
| 1121 | + case CameraDevice.TEMPLATE_STILL_CAPTURE: |
| 1122 | + captureIntent = CONTROL_CAPTURE_INTENT_STILL_CAPTURE; |
| 1123 | + break; |
| 1124 | + case CameraDevice.TEMPLATE_RECORD: |
| 1125 | + captureIntent = CONTROL_CAPTURE_INTENT_VIDEO_RECORD; |
| 1126 | + break; |
| 1127 | + default: |
| 1128 | + // Can't get anything else since it's guarded by the IAE check |
| 1129 | + throw new AssertionError("Impossible; keep in sync with sAllowedTemplates"); |
| 1130 | + } |
| 1131 | + m.set(CaptureRequest.CONTROL_CAPTURE_INTENT, captureIntent); |
| 1132 | + } |
1061 | 1133 |
|
1062 | 1134 | // control.aeMode |
1063 | 1135 | m.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); |
@@ -1094,6 +1166,11 @@ public static CameraMetadataNative createRequestTemplate( |
1094 | 1166 | } |
1095 | 1167 | } |
1096 | 1168 |
|
| 1169 | + if (VERBOSE) { |
| 1170 | + Log.v(TAG, "createRequestTemplate (templateId=" + templateId + ")," + |
| 1171 | + " afMode=" + afMode + ", minimumFocusDistance=" + minimumFocusDistance); |
| 1172 | + } |
| 1173 | + |
1097 | 1174 | m.set(CaptureRequest.CONTROL_AF_MODE, afMode); |
1098 | 1175 | } |
1099 | 1176 |
|
|
0 commit comments