Merge "CTS Verifier: Camera Video test with different resolutions (revision)." into klp-dev
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
index a67a498..22f1813 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
@@ -80,9 +80,9 @@
 
     private MediaRecorder mMediaRecorder;
 
-    private List<Camera.Size> mPreviewSizes;
-    private Camera.Size mNextPreviewSize;
-    private Camera.Size mPreviewSize;
+    private List<Size> mPreviewSizes;
+    private Size mNextPreviewSize;
+    private Size mPreviewSize;
     private List<Integer> mVideoSizeIds;
     private int mCurrentVideoSizeId;
 
@@ -488,8 +488,7 @@
         }
     }
 
-    // Match preview size with recording size
-    private Camera.Size matchPreviewRecordSize() {
+    private Size findRecordSize() {
         int[] possibleQuality = {
                 CamcorderProfile.QUALITY_QCIF,
                 CamcorderProfile.QUALITY_CIF,
@@ -506,8 +505,8 @@
                 mCamera.new Size(1920, 1080)
         };
 
-        Camera.Size minSize = mCamera.new Size(Integer.MAX_VALUE, Integer.MAX_VALUE);
-        Camera.Size maxSize = mCamera.new Size(0, 0);
+        Size minSize = mCamera.new Size(Integer.MAX_VALUE, Integer.MAX_VALUE);
+        Size maxSize = mCamera.new Size(0, 0);
 
         for (int i = 0; i < possibleQuality.length; i++) {
             if (mVideoSizeIds.contains(possibleQuality[i])) {
@@ -530,22 +529,55 @@
                     sizes[i].height));
         }
 
-        Camera.Size matchedSize = null;
+        Size recordSize = null;
         for (int i = 0; i < qualityList.size(); i++) {
             if (mCurrentVideoSizeId == qualityList.get(i).videoSizeId) {
-                matchedSize = mCamera.new Size(qualityList.get(i).width,
+                recordSize = mCamera.new Size(qualityList.get(i).width,
                         qualityList.get(i).height);
                 break;
             }
         }
 
-        if (VERBOSE) {
-            Log.v(TAG, "matchPreviewRecordSize: found a match");
+        if (recordSize == null) {
+            Log.e(TAG, "findRecordSize: did not find a match");
+            failTest("Cannot find video size");
         }
+        return recordSize;
+    }
+
+    // Match preview size with current recording size mCurrentVideoSizeId
+    private Size matchPreviewRecordSize() {
+        Size recordSize = findRecordSize();
+
+        Size matchedSize = null;
+        // First try to find exact match in size
+        for (int i = 0; i < mPreviewSizes.size(); i++) {
+            if (mPreviewSizes.get(i).equals(recordSize)) {
+                matchedSize = mCamera.new Size(recordSize.width, recordSize.height);
+                break;
+            }
+        }
+        // Second try to find one with similar if not the same aspect ratio
         if (matchedSize == null) {
-            Log.e(TAG, "matchPreviewRecordSize: did not find a match");
-            failTest("Cannot match preview size with video size");
+            for (int i = mPreviewSizes.size() - 1; i >= 0; i--) {
+                if (Math.abs((float)mPreviewSizes.get(i).width * recordSize.height /
+                        mPreviewSizes.get(i).height / recordSize.width - 1) < 0.1) {
+                    matchedSize = mCamera.new Size(mPreviewSizes.get(i).width,
+                            mPreviewSizes.get(i).height);
+                    break;
+                }
+            }
         }
+        // Last resort, just use the first preview size
+        if (matchedSize == null) {
+            matchedSize = mCamera.new Size(mPreviewSizes.get(0).width,
+                    mPreviewSizes.get(0).height);
+        }
+
+        if (VERBOSE) {
+            Log.v(TAG, "matchPreviewRecordSize " + matchedSize.width + "x" + matchedSize.height);
+        }
+
         return matchedSize;
     }
 
@@ -568,11 +600,11 @@
         }
 
         // Get preview resolutions
-        List<Camera.Size> unsortedSizes = p.getSupportedPreviewSizes();
+        List<Size> unsortedSizes = p.getSupportedPreviewSizes();
 
-        class SizeCompare implements Comparator<Camera.Size> {
+        class SizeCompare implements Comparator<Size> {
             @Override
-            public int compare(Camera.Size lhs, Camera.Size rhs) {
+            public int compare(Size lhs, Size rhs) {
                 if (lhs.width < rhs.width) return -1;
                 if (lhs.width > rhs.width) return 1;
                 if (lhs.height < rhs.height) return -1;
@@ -582,10 +614,10 @@
         };
 
         SizeCompare s = new SizeCompare();
-        TreeSet<Camera.Size> sortedResolutions = new TreeSet<Camera.Size>(s);
+        TreeSet<Size> sortedResolutions = new TreeSet<Size>(s);
         sortedResolutions.addAll(unsortedSizes);
 
-        mPreviewSizes = new ArrayList<Camera.Size>(sortedResolutions);
+        mPreviewSizes = new ArrayList<Size>(sortedResolutions);
 
         ArrayList<VideoSizeNamePair> availableVideoSizes = getVideoSizeNamePairs(id);
         String[] availableVideoSizeNames = new String[availableVideoSizes.size()];
@@ -609,8 +641,8 @@
         }
 
         // Set initial values
-        mNextPreviewSize = mPreviewSizes.get(0);
         mCurrentVideoSizeId = mVideoSizeIds.get(0);
+        mNextPreviewSize = matchPreviewRecordSize();
         mResolutionSpinner.setSelection(0);
 
         // Set up correct display orientation