ITS: Allow enabling video stabilization mode.

Allow enabling/disabling video stabilization mode during recording.

Bug: 227651775
Change-Id: If84287b5bbf0a32abcc36afabd79c614a014aa3a
diff --git a/apps/CameraITS/utils/its_session_utils.py b/apps/CameraITS/utils/its_session_utils.py
index 85ac686..c514740 100644
--- a/apps/CameraITS/utils/its_session_utils.py
+++ b/apps/CameraITS/utils/its_session_utils.py
@@ -452,7 +452,8 @@
     self.sock.settimeout(self.SOCK_TIMEOUT)
     return data['objValue']
 
-  def do_basic_recording(self, profile_id, quality, duration):
+  def do_basic_recording(self, profile_id, quality, duration,
+                         video_stabilization_mode=0):
     """Issue a recording request and read back the video recording object.
 
     The recording will be done with the format specified in quality. These
@@ -465,6 +466,10 @@
       profile_id: int; profile id corresponding to the quality level.
       quality: Video recording quality such as High, Low, VGA.
       duration: The time in seconds for which the video will be recorded.
+      video_stabilization_mode: Video stabilization mode ON/OFF. Value can be
+      0: 'OFF'
+      1: 'ON'
+      2: 'PREVIEW'
     Returns:
       video_recorded_object: The recorded object returned from ItsService which
       contains path at which the recording is saved on the device, quality of the
@@ -482,7 +487,8 @@
       }
     """
     cmd = {'cmdName': 'doBasicRecording', 'cameraId': self._camera_id,
-        'profileId': profile_id, 'quality': quality, 'recordingDuration': duration}
+        'profileId': profile_id, 'quality': quality, 'recordingDuration': duration,
+        'videoStabilizationMode': video_stabilization_mode}
     self.sock.send(json.dumps(cmd).encode() + '\n'.encode())
     timeout = self.SOCK_TIMEOUT + self.EXTRA_SOCK_TIMEOUT
     self.sock.settimeout(timeout)
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 17f2238..23e25d9 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
@@ -34,8 +34,10 @@
 import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.CameraMetadata;
 import android.hardware.camera2.DngCreator;
 import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.cts.CameraTestUtils;
 import android.hardware.camera2.cts.PerformanceTest;
 import android.hardware.camera2.params.InputConfiguration;
 import android.hardware.camera2.params.MeteringRectangle;
@@ -781,7 +783,9 @@
                     int profileId = cmdObj.getInt("profileId");
                     String quality = cmdObj.getString("quality");
                     int recordingDuration = cmdObj.getInt("recordingDuration");
-                    doBasicRecording(cameraId, profileId, quality, recordingDuration);
+                    int videoStabilizationMode = cmdObj.getInt("videoStabilizationMode");
+                    doBasicRecording(cameraId, profileId, quality, recordingDuration,
+                            videoStabilizationMode);
                 } else {
                     throw new ItsException("Unknown command: " + cmd);
                 }
@@ -1729,12 +1733,28 @@
         }
     }
 
+    private boolean isVideoStabilizationModeSupported(int mode) {
+        int[] videoStabilizationModes = mCameraCharacteristics.get(
+                CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
+        List<Integer> arrList = Arrays.asList(CameraTestUtils.toObject(videoStabilizationModes));
+        assert(videoStabilizationModes != null);
+        assert(arrList.contains(CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_OFF));
+        Log.i(TAG, "videoStabilizationModes:" + Arrays.toString(videoStabilizationModes));
+        return arrList.contains(mode);
+    }
+
     private void doBasicRecording(String cameraId, int profileId, String quality,
-            int recordingDuration) throws ItsException {
+            int recordingDuration, int videoStabilizationMode) throws ItsException {
         int cameraDeviceId = Integer.parseInt(cameraId);
         mMediaRecorder = new MediaRecorder();
         CamcorderProfile camcorderProfile = getCamcorderProfile(cameraDeviceId, profileId);
         assert(camcorderProfile != null);
+        boolean supportsVideoStabilizationMode = isVideoStabilizationModeSupported(
+                videoStabilizationMode);
+        if (!supportsVideoStabilizationMode) {
+            throw new ItsException("Device does not support video stabilization mode: " +
+                    videoStabilizationMode);
+        }
         Size videoSize = new Size(camcorderProfile.videoFrameWidth,
                 camcorderProfile.videoFrameHeight);
         int fileFormat = camcorderProfile.fileFormat;
@@ -1752,7 +1772,7 @@
         mRecordSurface = mMediaRecorder.getSurface();
         // Configure and create capture session.
         try {
-            configureAndCreateCaptureSession(mRecordSurface);
+            configureAndCreateCaptureSession(mRecordSurface, videoStabilizationMode);
         } catch (android.hardware.camera2.CameraAccessException e) {
             throw new ItsException("Access error: ", e);
         }
@@ -1786,11 +1806,16 @@
         mSocketRunnableObj.sendVideoRecordingObject(obj);
     }
 
-    private void configureAndCreateCaptureSession(Surface recordSurface)
+    private void configureAndCreateCaptureSession(Surface recordSurface, int videoStabilizationMode)
             throws CameraAccessException{
         assert(recordSurface != null);
         // Create capture request builder
         mCaptureRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
+        if (videoStabilizationMode == CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON) {
+            mCaptureRequestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
+                    CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON);
+            Log.i(TAG, "Turned ON video stabilization.");
+        }
         mCaptureRequestBuilder.addTarget(recordSurface);
         // Create capture session
         mCamera.createCaptureSession(Arrays.asList(recordSurface),