diff options
author | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-01-23 18:45:54 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-01-23 18:45:54 +0000 |
commit | 17235c02343c54be44278a4a55e86f370664a2e9 (patch) | |
tree | a55bd1b9f93a388659887bf758405beef13a4081 | |
parent | 954691c143631807464ecceb6fa3dbba2a15d5df (diff) | |
parent | f93d4f32bc1011cf94e937ee81faf4045caacf7e (diff) | |
download | cts-17235c02343c54be44278a4a55e86f370664a2e9.tar.gz |
Merge "Merge "ITS: Update skip condition for multi camera test." into android13-tests-dev am: 3af9748ee5"
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); |