TestingCamera: Add Video Frame Rate Selection

Add selectable frame rates for video recording.  Chosen based on the
list of preview frame rates available.

Change-Id: I11e93061f214646ae44a5e4f649b86405caefd06
diff --git a/apps/TestingCamera/res/layout/main.xml b/apps/TestingCamera/res/layout/main.xml
index a83c5db..42dce9b 100644
--- a/apps/TestingCamera/res/layout/main.xml
+++ b/apps/TestingCamera/res/layout/main.xml
@@ -239,6 +239,20 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1" />
 
+            <TextView
+                android:id="@+id/video_frame_rate_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/video_frame_rate_prompt"
+                android:textAppearance="?android:attr/textAppearanceSmall" />
+
+            <Spinner
+                android:id="@+id/video_frame_rate_spinner"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1" />
+
             <ToggleButton
                 android:id="@+id/start_record"
                 android:layout_width="fill_parent"
diff --git a/apps/TestingCamera/res/values/strings.xml b/apps/TestingCamera/res/values/strings.xml
index e86b350..41f107f 100644
--- a/apps/TestingCamera/res/values/strings.xml
+++ b/apps/TestingCamera/res/values/strings.xml
@@ -30,6 +30,7 @@
     <string name="record_off_label">Recording off</string>
     <string name="camcorder_profile_prompt">Camcorder profile</string>
     <string name="video_record_size_prompt">Video Record size</string>
+    <string name="video_frame_rate_prompt">Video Frame Rate</string>
     <string name="horiz_rule_color">#777777</string>
     <string name="show_info">Info</string>
     <string name="info_ok_button_label">OK</string>
diff --git a/apps/TestingCamera/src/com/android/testingcamera/TestingCamera.java b/apps/TestingCamera/src/com/android/testingcamera/TestingCamera.java
index dc58384..1ca0e87 100644
--- a/apps/TestingCamera/src/com/android/testingcamera/TestingCamera.java
+++ b/apps/TestingCamera/src/com/android/testingcamera/TestingCamera.java
@@ -78,6 +78,7 @@
     private Button  mTakePictureButton;
     private Spinner mCamcorderProfileSpinner;
     private Spinner mVideoRecordSizeSpinner;
+    private Spinner mVideoFrameRateSpinner;
     private ToggleButton mRecordToggle;
 
     private TextView mLogView;
@@ -100,6 +101,8 @@
     private int mCamcorderProfile = 0;
     private List<Camera.Size> mVideoRecordSizes;
     private int mVideoRecordSize = 0;
+    private List<Integer> mVideoFrameRates;
+    private int mVideoFrameRate = 0;
 
     private MediaRecorder mRecorder;
     private File mRecordingFile;
@@ -165,6 +168,9 @@
         mVideoRecordSizeSpinner = (Spinner) findViewById(R.id.video_record_size_spinner);
         mVideoRecordSizeSpinner.setOnItemSelectedListener(mVideoRecordSizeListener);
 
+        mVideoFrameRateSpinner = (Spinner) findViewById(R.id.video_frame_rate_spinner);
+        mVideoFrameRateSpinner.setOnItemSelectedListener(mVideoFrameRateListener);
+
         mRecordToggle = (ToggleButton) findViewById(R.id.start_record);
         mRecordToggle.setOnClickListener(mRecordToggleListener);
         mPreviewOnlyControls.add(mRecordToggle);
@@ -464,6 +470,21 @@
         }
     };
 
+    private AdapterView.OnItemSelectedListener mVideoFrameRateListener =
+                new AdapterView.OnItemSelectedListener() {
+        public void onItemSelected(AdapterView<?> parent,
+                        View view, int pos, long id) {
+            if (pos == mVideoFrameRate) return;
+
+            log("Setting video frame rate to " + ((TextView)view).getText());
+            mVideoFrameRate = pos;
+        }
+
+        public void onNothingSelected(AdapterView<?> parent) {
+
+        }
+    };
+
     private View.OnClickListener mRecordToggleListener =
             new View.OnClickListener() {
         public void onClick(View v) {
@@ -539,6 +560,7 @@
         updateSnapshotSizes(mParams);
         updateCamcorderProfile(mCameraId);
         updateVideoRecordSize(mCameraId);
+        updateVideoFrameRate(mCameraId);
 
         // Update parameters based on above updates
         mCamera.setParameters(mParams);
@@ -729,6 +751,29 @@
         log("Setting video record profile to " + nameArray[mVideoRecordSize]);
     }
 
+    private void updateVideoFrameRate(int cameraId) {
+        // Use preview framerates as video framerates
+        List<Integer> frameRates = mParams.getSupportedPreviewFrameRates();
+
+        List<String> frameRateStrings = new ArrayList<String>();
+        mVideoFrameRates = new ArrayList<Integer>();
+
+        frameRateStrings.add("Default");
+        mVideoFrameRates.add(0);
+
+        for (Integer frameRate : frameRates) {
+            frameRateStrings.add(frameRate.toString());
+            mVideoFrameRates.add(frameRate);
+        }
+        String[] nameArray = (String[])frameRateStrings.toArray(new String[0]);
+        mVideoFrameRateSpinner.setAdapter(
+                new ArrayAdapter<String>(
+                        this, R.layout.spinner_item, nameArray));
+
+        mVideoFrameRate = 0;
+        log("Setting frame rate to " + nameArray[mVideoFrameRate]);
+    }
+
     void resizePreview(int width, int height) {
         if (mPreviewHolder != null) {
             int viewHeight = mPreviewView.getHeight();
@@ -827,6 +872,9 @@
         if (videoRecordSize.width > 0 && videoRecordSize.height > 0) {
             mRecorder.setVideoSize(videoRecordSize.width, videoRecordSize.height);
         }
+        if (mVideoFrameRates.get(mVideoFrameRate) > 0) {
+            mRecorder.setVideoFrameRate(mVideoFrameRates.get(mVideoFrameRate));
+        }
         File outputFile = getOutputMediaFile(MEDIA_TYPE_VIDEO);
         log("File name:" + outputFile.toString());
         mRecorder.setOutputFile(outputFile.toString());