summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-01-23 18:45:54 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2023-01-23 18:45:54 +0000
commit17235c02343c54be44278a4a55e86f370664a2e9 (patch)
treea55bd1b9f93a388659887bf758405beef13a4081
parent954691c143631807464ecceb6fa3dbba2a15d5df (diff)
parentf93d4f32bc1011cf94e937ee81faf4045caacf7e (diff)
downloadcts-17235c02343c54be44278a4a55e86f370664a2e9.tar.gz
Merge "Merge "ITS: Update skip condition for multi camera test." into android13-tests-dev am: 3af9748ee5"
-rw-r--r--apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py13
-rw-r--r--apps/CameraITS/utils/its_session_utils.py18
-rw-r--r--apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java57
3 files changed, 87 insertions, 1 deletions
diff --git a/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py b/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py
index 93e4f11864b..834fe9b144d 100644
--- a/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py
+++ b/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py
@@ -245,10 +245,21 @@ class MultiCameraFrameSyncTest(its_base_test.ItsBaseTest):
hidden_physical_id=self.hidden_physical_id) as cam:
props = cam.get_camera_properties()
props = cam.override_with_hidden_physical_camera_props(props)
+ unavailable_physical_cameras = cam.get_unavailable_physical_cameras(
+ self.camera_id)
+ unavailable_physical_ids = unavailable_physical_cameras['unavailablePhysicalCamerasArray']
+ # find available physical camera IDs
+ all_physical_ids = camera_properties_utils.logical_multi_camera_physical_ids(
+ props)
+ for i in unavailable_physical_ids:
+ if i in all_physical_ids:
+ all_physical_ids.remove(i)
+ logging.debug('available physical ids: %s', all_physical_ids)
# Check SKIP conditions.
camera_properties_utils.skip_unless(
- camera_properties_utils.multi_camera_frame_sync_capable(props))
+ camera_properties_utils.multi_camera_frame_sync_capable(props) and
+ len(all_physical_ids) >= 2)
# Get first API level & multi camera sync type
first_api_level = its_session_utils.get_first_api_level(self.dut.serial)
diff --git a/apps/CameraITS/utils/its_session_utils.py b/apps/CameraITS/utils/its_session_utils.py
index 480fca3f055..4e01da0bf4b 100644
--- a/apps/CameraITS/utils/its_session_utils.py
+++ b/apps/CameraITS/utils/its_session_utils.py
@@ -453,6 +453,24 @@ class ItsSession(object):
self.sock.settimeout(self.SOCK_TIMEOUT)
return data['objValue']
+ def get_unavailable_physical_cameras(self, camera_id):
+ """Get the unavailable physical cameras ids.
+
+ Args:
+ camera_id: int; device id
+ Returns:
+ List of all physical camera ids which are unavailable.
+ """
+ cmd = {'cmdName': 'doGetUnavailablePhysicalCameras',
+ 'cameraId': camera_id}
+ self.sock.send(json.dumps(cmd).encode() + '\n'.encode())
+ timeout = self.SOCK_TIMEOUT + self.EXTRA_SOCK_TIMEOUT
+ self.sock.settimeout(timeout)
+ data, _ = self.__read_response_from_socket()
+ if data['tag'] != 'unavailablePhysicalCameras':
+ raise error_util.CameraItsError('Invalid command response')
+ return data['objValue']
+
def is_hlg10_recording_supported(self, profile_id):
"""Query whether the camera device supports HLG10 video recording.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index 4ef46fa1dd0..8d1d3a0eaa9 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -78,6 +78,7 @@ import android.os.IBinder;
import android.os.SystemClock;
import android.os.Vibrator;
import android.util.Log;
+import android.util.Pair;
import android.util.Rational;
import android.util.Size;
import android.util.SparseArray;
@@ -123,6 +124,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.HashSet;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingDeque;
@@ -183,6 +185,8 @@ public class ItsService extends Service implements SensorEventListener {
public static final String EVCOMP_KEY = "evComp";
public static final String AUTO_FLASH_KEY = "autoFlash";
public static final String AUDIO_RESTRICTION_MODE_KEY = "mode";
+ public static final int AVAILABILITY_TIMEOUT_MS = 10;
+
private CameraManager mCameraManager = null;
private HandlerThread mCameraThread = null;
@@ -252,6 +256,8 @@ public class ItsService extends Service implements SensorEventListener {
private volatile boolean mNeedsLockedAWB = false;
private volatile boolean mDoAE = true;
private volatile boolean mDoAF = true;
+ private Set<Pair<String, String>> mUnavailablePhysicalCameras;
+
class MySensorEvent {
public Sensor sensor;
@@ -469,6 +475,7 @@ public class ItsService extends Service implements SensorEventListener {
}
try {
+ mUnavailablePhysicalCameras = getUnavailablePhysicalCameras();
mCamera = mBlockingCameraManager.openCamera(cameraId, mCameraListener, mCameraHandler);
mCameraCharacteristics = mCameraManager.getCameraCharacteristics(cameraId);
@@ -826,6 +833,9 @@ public class ItsService extends Service implements SensorEventListener {
doCheckHLG10Support(cameraId, profileId);
} else if ("doCaptureWithFlash".equals(cmdObj.getString("cmdName"))) {
doCaptureWithFlash(cmdObj);
+ } else if ("doGetUnavailablePhysicalCameras".equals(cmdObj.getString("cmdName"))) {
+ String cameraId = cmdObj.getString("cameraId");
+ doGetUnavailablePhysicalCameras(cameraId);
} else {
throw new ItsException("Unknown command: " + cmd);
}
@@ -1184,6 +1194,53 @@ public class ItsService extends Service implements SensorEventListener {
hasPrivacySupport ? "true" : "false");
}
+ private void doGetUnavailablePhysicalCameras(String cameraId) throws ItsException {
+ try {
+ JSONArray cameras = new JSONArray();
+ JSONObject jsonObj = new JSONObject();
+ for (Pair<String, String> p : mUnavailablePhysicalCameras) {
+ if (cameraId.equals(p.first)) {
+ cameras.put(p.second);
+ }
+ }
+ jsonObj.put("unavailablePhysicalCamerasArray", cameras);
+ Log.i(TAG, "unavailablePhysicalCameras : " +
+ Arrays.asList(mUnavailablePhysicalCameras.toString()));
+ mSocketRunnableObj.sendResponse("unavailablePhysicalCameras", null, jsonObj, null);
+ } catch (org.json.JSONException e) {
+ throw new ItsException("JSON error: ", e);
+ }
+ }
+
+ private Set<Pair<String, String>> getUnavailablePhysicalCameras() throws ItsException {
+ final LinkedBlockingQueue<Pair<String, String>> unavailablePhysicalCamEventQueue =
+ new LinkedBlockingQueue<>();
+ try {
+ CameraManager.AvailabilityCallback ac = new CameraManager.AvailabilityCallback() {
+ @Override
+ public void onPhysicalCameraUnavailable(String cameraId, String physicalCameraId) {
+ unavailablePhysicalCamEventQueue.offer(new Pair<>(cameraId, physicalCameraId));
+ }
+ };
+ mCameraManager.registerAvailabilityCallback(ac, mCameraHandler);
+ Set<Pair<String, String>> unavailablePhysicalCameras =
+ new HashSet<Pair<String, String>>();
+ Pair<String, String> candidatePhysicalIds =
+ unavailablePhysicalCamEventQueue.poll(AVAILABILITY_TIMEOUT_MS,
+ java.util.concurrent.TimeUnit.MILLISECONDS);
+ while (candidatePhysicalIds != null) {
+ unavailablePhysicalCameras.add(candidatePhysicalIds);
+ candidatePhysicalIds =
+ unavailablePhysicalCamEventQueue.poll(AVAILABILITY_TIMEOUT_MS,
+ java.util.concurrent.TimeUnit.MILLISECONDS);
+ }
+ mCameraManager.unregisterAvailabilityCallback(ac);
+ return unavailablePhysicalCameras;
+ } catch (Exception e) {
+ throw new ItsException("Exception: ", e);
+ }
+ }
+
private void doCheckPrimaryCamera(String cameraId) throws ItsException {
if (mItsCameraIdList == null) {
mItsCameraIdList = ItsUtils.getItsCompatibleCameraIds(mCameraManager);