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),