Add video snapshot CTS.

bug:5169599
Change-Id: I46f4b3de3c9fd67aff0fe037e3171ce8a673b0ba
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index f6aa2a2..78def20 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -344,20 +344,20 @@
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
             Log.v(TAG, "Camera id=" + id);
-            testTakePictureByCamera(id);
+            initializeMessageLooper(id);
+            mCamera.startPreview();
+            testTakePictureByCamera();
+            terminateMessageLooper();
         }
     }
 
-    private void testTakePictureByCamera(int cameraId) throws Exception {
-        initializeMessageLooper(cameraId);
+    private void testTakePictureByCamera() throws Exception {
         Size pictureSize = mCamera.getParameters().getPictureSize();
-        mCamera.startPreview();
         mCamera.autoFocus(mAutoFocusCallback);
         assertTrue(waitForFocusDone());
         mJpegData = null;
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
-        terminateMessageLooper();
         assertTrue("Shutter callback not received", mShutterCallbackResult);
         assertTrue("Raw picture callback not received", mRawPictureCallbackResult);
         assertTrue("Jpeg picture callback not recieved", mJpegPictureCallbackResult);
@@ -810,12 +810,13 @@
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
             Log.v(TAG, "Camera id=" + id);
-            testJpegThumbnailSizeByCamera(id);
+            initializeMessageLooper(id);
+            testJpegThumbnailSizeByCamera(false);
+            terminateMessageLooper();
         }
     }
 
-    private void testJpegThumbnailSizeByCamera(int cameraId) throws Exception {
-        initializeMessageLooper(cameraId);
+    private void testJpegThumbnailSizeByCamera(boolean recording) throws Exception {
         // Thumbnail size parameters should have valid values.
         Parameters p = mCamera.getParameters();
         Size size = p.getJpegThumbnailSize();
@@ -826,7 +827,7 @@
         assertTrue(sizes.contains(mCamera.new Size(0, 0)));
 
         // Test if the thumbnail size matches the setting.
-        mCamera.startPreview();
+        if (!recording) mCamera.startPreview();
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
         assertTrue(mJpegPictureCallbackResult);
@@ -845,14 +846,12 @@
         Size actual = mCamera.getParameters().getJpegThumbnailSize();
         assertEquals(0, actual.width);
         assertEquals(0, actual.height);
-        mCamera.startPreview();
+        if (!recording) mCamera.startPreview();
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
         assertTrue(mJpegPictureCallbackResult);
         exif = new ExifInterface(JPEG_PATH);
         assertFalse(exif.hasThumbnail());
-
-        terminateMessageLooper();
     }
 
     @UiThreadTest
@@ -860,15 +859,16 @@
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
             Log.v(TAG, "Camera id=" + id);
-            testJpegExifByCamera(id);
+            initializeMessageLooper(id);
+            testJpegExifByCamera(false);
+            terminateMessageLooper();
         }
     }
 
-    private void testJpegExifByCamera(int cameraId) throws Exception {
-        initializeMessageLooper(cameraId);
+    private void testJpegExifByCamera(boolean recording) throws Exception {
         Camera.Parameters parameters = mCamera.getParameters();
-        mCamera.startPreview();
-        double focalLength = (double)parameters.getFocalLength();
+        if (!recording) mCamera.startPreview();
+        double focalLength = parameters.getFocalLength();
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
         ExifInterface exif = new ExifInterface(JPEG_PATH);
@@ -878,8 +878,7 @@
         assertTrue(exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0) != 0);
         assertTrue(exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0) != 0);
         checkGpsDataNull(exif);
-        double exifFocalLength = (double)exif.getAttributeDouble(
-                ExifInterface.TAG_FOCAL_LENGTH, -1);
+        double exifFocalLength = exif.getAttributeDouble(ExifInterface.TAG_FOCAL_LENGTH, -1);
         assertEquals(focalLength, exifFocalLength, 0.001);
 
         // Test gps exif tags.
@@ -889,14 +888,13 @@
         testGpsExifValues(parameters, -89.736071, -179.441983, 100000, 1199145602, "NETWORK");
 
         // Test gps tags do not exist after calling removeGpsData.
-        mCamera.startPreview();
+        if (!recording) mCamera.startPreview();
         parameters.removeGpsData();
         mCamera.setParameters(parameters);
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
         exif = new ExifInterface(JPEG_PATH);
         checkGpsDataNull(exif);
-        terminateMessageLooper();
     }
 
     private void testGpsExifValues(Parameters parameters, double latitude,
@@ -2790,4 +2788,58 @@
             }
         }
     }
+
+    @UiThreadTest
+    public void testVideoSnapshot() throws Exception {
+        int nCameras = Camera.getNumberOfCameras();
+        for (int id = 0; id < nCameras; id++) {
+            Log.v(TAG, "Camera id=" + id);
+            testVideoSnapshotByCamera(id);
+        }
+    }
+
+    private void testVideoSnapshotByCamera(int cameraId) throws Exception {
+        initializeMessageLooper(cameraId);
+        Camera.Parameters parameters = mCamera.getParameters();
+        if (!parameters.isVideoSnapshotSupported()) return;
+
+        SurfaceHolder holder = getActivity().getSurfaceView().getHolder();
+
+        // Set the preview size.
+        CamcorderProfile profile = CamcorderProfile.get(cameraId,
+                CamcorderProfile.QUALITY_LOW);
+        setPreviewSizeByProfile(parameters, profile);
+
+        // Set the biggest picture size.
+        Size biggestSize = mCamera.new Size(-1, -1);
+        for (Size size: parameters.getSupportedPictureSizes()) {
+            if (biggestSize.width < size.width) {
+                biggestSize = size;
+            }
+        }
+        parameters.setPictureSize(biggestSize.width, biggestSize.height);
+
+        mCamera.setParameters(parameters);
+        mCamera.startPreview();
+        mCamera.unlock();
+        MediaRecorder recorder = new MediaRecorder();
+        try {
+            recorder.setCamera(mCamera);
+            recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
+            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+            recorder.setProfile(profile);
+            recorder.setOutputFile("/dev/null");
+            recorder.setPreviewDisplay(holder.getSurface());
+            recorder.prepare();
+            recorder.start();
+            testTakePictureByCamera();
+            testJpegExifByCamera(true);
+            testJpegThumbnailSizeByCamera(true);
+            recorder.stop();
+        } finally {
+            recorder.release();
+            mCamera.lock();
+        }
+        terminateMessageLooper();
+    }
 }