VideoChatTestActivity.java revision 430aa048a20aa42f089d213d8b4b6c67ab1b43fe
1d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd/* 2d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Copyright (C) 2010 The Android Open Source Project 3d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * 4d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * you may not use this file except in compliance with the License. 6d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * You may obtain a copy of the License at 7d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * 8d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * 10d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * See the License for the specific language governing permissions and 14d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * limitations under the License. 15d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */ 16d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 17d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpackage com.example.android.videochatcameratest; 18d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 19d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.app.Activity; 20d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.graphics.ImageFormat; 21d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera; 22d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera.Size; 23d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.AsyncTask; 24d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.Bundle; 25d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.util.Log; 265ef376788944f9deb937798e96a20fd93058815bMike Doddimport android.view.Surface; 27430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.view.TextureView; 28d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View; 29d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View.OnClickListener; 30d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.Button; 31d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.CheckBox; 32430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.widget.FrameLayout; 33d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.TextView; 34d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 35d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport java.io.IOException; 36202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Doddimport java.lang.UnsupportedOperationException; 371c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.ArrayList; 381c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.List; 39d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 40d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd/** 41d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * This class provides a basic demonstration of how to write an Android 42d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * activity. Inside of its window, it places a single view: an EditText that 43d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * displays and edits some internal text. 44d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */ 45d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpublic class VideoChatTestActivity extends Activity { 46d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 47d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd static final private int NUM_CAMERA_PREVIEW_BUFFERS = 2; 48430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd static final boolean sRunningOnHoneycomb; 49d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd static final private String TAG = "VideoChatTest"; 50202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd TextView mTextStatusHistory; 51430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd static { 52430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd sRunningOnHoneycomb = 53430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB; 54430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 55430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd 56d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public VideoChatTestActivity() { 57d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 58d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 59d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd /** Called with the activity is first created. */ 60d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 61d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public void onCreate(Bundle savedInstanceState) { 62d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd super.onCreate(savedInstanceState); 63d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 64d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd // Inflate our UI from its XML layout description. 65d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd setContentView(R.layout.videochatcameratest_activity); 66d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 67430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd FrameLayout fl = (FrameLayout)findViewById(R.id.previewFrame); 68430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd 69430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 70430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd fl.addView(new SurfaceTextureView(this)); 71430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 72430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd fl.addView(new CameraPreviewView(this)); 73430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 74430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd 75d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd ((Button) findViewById(R.id.gobutton)).setOnClickListener(mGoListener); 76d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 77d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd ((TextView)findViewById(R.id.statushistory)).setVerticalScrollBarEnabled(true); 78202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd mTextStatusHistory = (TextView) findViewById(R.id.statushistory); 79d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 805ef376788944f9deb937798e96a20fd93058815bMike Dodd logMessage("Display Orientation " + getDisplayOrientation()); 81202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (int i = 0; i < Camera.getNumberOfCameras(); i++) { 82202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd dumpCameraCaps(i); 83202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 84d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 85d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 86202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd private void logMessage(String message) { 87202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Log.v(TAG, message); 88202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd mTextStatusHistory.append(message + "\r\n"); 89202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 90202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd 91202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd public int getCameraOrientation(int id) { 92202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera.CameraInfo info = 93202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd new Camera.CameraInfo(); 94202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera.getCameraInfo(id, info); 95202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd return info.orientation; 96202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 97202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd 98202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd private void dumpCameraCaps(int id) { 99202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera cam = Camera.open(id); 100202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera.Parameters params = cam.getParameters(); 101202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd List<Integer> formats = params.getSupportedPreviewFormats(); 102202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd List<int[]> frameRates = params.getSupportedPreviewFpsRange(); 103202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd List<Camera.Size> sizes = params.getSupportedPreviewSizes(); 104202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("Camera " + id); 105202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("Orientation " + getCameraOrientation(id)); 106202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("Sizes"); 107202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (Size size : sizes) { 108202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage(size.width + "x" + size.height); 109202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 110202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("frameRates"); 111202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (int[] rates : frameRates) { 112202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage(rates[0] + "-" + rates[1]); 113202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 114202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("formats"); 115202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (Integer format : formats) { 116202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage(format.toString()); 117202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 118202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd cam.release(); 119202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 120d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd /** 121d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Called when the activity is about to start interacting with the user. 122d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */ 123d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 124d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd protected void onResume() { 125d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd super.onResume(); 126d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 127d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 1285ef376788944f9deb937798e96a20fd93058815bMike Dodd private int getDisplayOrientation() { 1295ef376788944f9deb937798e96a20fd93058815bMike Dodd int rotation = getWindowManager().getDefaultDisplay().getRotation(); 1305ef376788944f9deb937798e96a20fd93058815bMike Dodd int degrees = 0; 1315ef376788944f9deb937798e96a20fd93058815bMike Dodd switch (rotation) { 1325ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_0: 1335ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 0; 1345ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1355ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_90: 1365ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 90; 1375ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1385ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_180: 1395ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 180; 1405ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1415ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_270: 1425ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 270; 1435ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1445ef376788944f9deb937798e96a20fd93058815bMike Dodd } 1455ef376788944f9deb937798e96a20fd93058815bMike Dodd return degrees; 1465ef376788944f9deb937798e96a20fd93058815bMike Dodd } 1475ef376788944f9deb937798e96a20fd93058815bMike Dodd 148d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd /** 149d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * A call-back for when the user presses the back button. 150d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */ 151d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd OnClickListener mGoListener = new OnClickListener() { 1525ef376788944f9deb937798e96a20fd93058815bMike Dodd @Override 153d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public void onClick(View v) { 1545ef376788944f9deb937798e96a20fd93058815bMike Dodd int degrees = getDisplayOrientation(); 1555ef376788944f9deb937798e96a20fd93058815bMike Dodd new CameraTestRunner().execute(new Integer[] { degrees }); 156d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 157d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd }; 158d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 1595ef376788944f9deb937798e96a20fd93058815bMike Dodd private class CameraTestRunner extends AsyncTask<Integer, String, Void> { 160d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 161d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd TextView mTextStatus; 162d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd TextView mTextStatusHistory; 1635ef376788944f9deb937798e96a20fd93058815bMike Dodd private int mDisplayOrientation; 164d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 165d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 1665ef376788944f9deb937798e96a20fd93058815bMike Dodd protected Void doInBackground(Integer... params) { 1675ef376788944f9deb937798e96a20fd93058815bMike Dodd mDisplayOrientation = params[0]; 168897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd mTextStatus = (TextView) findViewById(R.id.status); 169897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd mTextStatusHistory = (TextView) findViewById(R.id.statushistory); 170897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testFrontCamera = 171897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd ((CheckBox) findViewById(R.id.frontcameracheckbox)).isChecked(); 172897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testBackCamera = ((CheckBox) findViewById(R.id.backcameracheckbox)).isChecked(); 173897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testQVGA = ((CheckBox) findViewById(R.id.qvgacheckbox)).isChecked(); 174897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testVGA = ((CheckBox) findViewById(R.id.vgacheckbox)).isChecked(); 175897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean test15fps = ((CheckBox) findViewById(R.id.fps15checkbox)).isChecked(); 176897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean test30fps = ((CheckBox) findViewById(R.id.fps30checkbox)).isChecked(); 177897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate0 = ((CheckBox) findViewById(R.id.rotate0checkbox)).isChecked(); 178897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate90 = ((CheckBox) findViewById(R.id.rotate90checkbox)).isChecked(); 179897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate180 = ((CheckBox) findViewById(R.id.rotate180checkbox)).isChecked(); 180897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate270 = ((CheckBox) findViewById(R.id.rotate270checkbox)).isChecked(); 1815ef376788944f9deb937798e96a20fd93058815bMike Dodd boolean testRotateAuto = ((CheckBox) findViewById(R.id.rotateautocheckbox)).isChecked(); 1821c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 1831c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd ArrayList<Integer> setDisplayOrentationAngles = new ArrayList<Integer>(); 1841c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 1851c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate0) { 1861c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(0); 1871c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1881c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate90) { 1891c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(90); 1901c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1911c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate180) { 1921c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(180); 1931c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1941c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate270) { 1951c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(270); 1961c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1975ef376788944f9deb937798e96a20fd93058815bMike Dodd if (testRotateAuto) { 1985ef376788944f9deb937798e96a20fd93058815bMike Dodd setDisplayOrentationAngles.add(-1); 1995ef376788944f9deb937798e96a20fd93058815bMike Dodd } 200d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 201897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd final int widths[] = new int[] {320, 640}; 202897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd final int heights[] = new int[] {240, 480}; 203d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 204897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd final int framerates[] = new int[] {15, 30}; 205d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 2065ef376788944f9deb937798e96a20fd93058815bMike Dodd ArrayList<Integer> whichCameras = new ArrayList<Integer>(); 2075ef376788944f9deb937798e96a20fd93058815bMike Dodd int numCameras = Camera.getNumberOfCameras(); 2085ef376788944f9deb937798e96a20fd93058815bMike Dodd if (testFrontCamera) { 2095ef376788944f9deb937798e96a20fd93058815bMike Dodd for (int i = 0; i < numCameras; i++) { 2105ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.CameraInfo info = new Camera.CameraInfo(); 2115ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.getCameraInfo(i, info); 2125ef376788944f9deb937798e96a20fd93058815bMike Dodd if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 2135ef376788944f9deb937798e96a20fd93058815bMike Dodd whichCameras.add(i); 2145ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 215d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 2165ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2175ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2185ef376788944f9deb937798e96a20fd93058815bMike Dodd if (testBackCamera) { 2195ef376788944f9deb937798e96a20fd93058815bMike Dodd for (int i = 0; i < numCameras; i++) { 2205ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.CameraInfo info = new Camera.CameraInfo(); 2215ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.getCameraInfo(i, info); 2225ef376788944f9deb937798e96a20fd93058815bMike Dodd if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 2235ef376788944f9deb937798e96a20fd93058815bMike Dodd whichCameras.add(i); 2245ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 225d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 2265ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2275ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2285ef376788944f9deb937798e96a20fd93058815bMike Dodd do { 2295ef376788944f9deb937798e96a20fd93058815bMike Dodd for (Integer whichCamera : whichCameras) { 230897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd for (int whichResolution = 0; whichResolution < 2; whichResolution++) { 231897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichResolution == 0 && !testQVGA) { 232d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd continue; 233d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 234897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichResolution == 1 && !testVGA) { 235d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd continue; 236d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 237d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 238897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd for (int whichFramerate = 0; whichFramerate < 2; whichFramerate++) { 239897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichFramerate == 0 && !test15fps) { 240897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd continue; 241897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } 242897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichFramerate == 1 && !test30fps) { 243897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd continue; 244897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } 245897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd 246897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd TestCamera(whichCamera, widths[whichResolution], 247897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd heights[whichResolution], framerates[whichFramerate], 248897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd setDisplayOrentationAngles); 249897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } 250d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 251d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 252897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } while (((CheckBox) findViewById(R.id.repeatcheckbox)).isChecked()); 253d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd // start tests 254d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 255d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd return null; 256d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 257d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 258d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 259d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd protected void onPostExecute(Void result) { 260d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd final String allDoneString = "Test complete"; 261d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, allDoneString); 262d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatus.setText(allDoneString); 263d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatusHistory.append(allDoneString + "\r\n"); 264d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 265d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 266d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 267d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd private class FrameCatcher implements Camera.PreviewCallback { 268d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public int mFrames = 0; 269202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd private final int mExpectedSize; 270d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public FrameCatcher(int width, int height) { 271202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd mExpectedSize = width * height * 3 / 2; 272d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 273d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 274d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 275d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public void onPreviewFrame(byte[] data, Camera camera) { 276202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd if (mExpectedSize != data.length) { 277202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd throw new UnsupportedOperationException("bad size, got " + data.length + " expected " + mExpectedSize); 278202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 279d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mFrames++; 280d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.addCallbackBuffer(data); 281d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 282d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 283d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 2841c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 2851c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd private void setupCallback(Camera camera, FrameCatcher catcher, int bufferSize) { 2861c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.setPreviewCallbackWithBuffer(null); 2871c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.setPreviewCallbackWithBuffer(catcher); 2881c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd for (int i = 0; i < NUM_CAMERA_PREVIEW_BUFFERS; i++) { 2891c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd byte [] cameraBuffer = new byte[bufferSize]; 2901c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.addCallbackBuffer(cameraBuffer); 2911c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 2921c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 2935ef376788944f9deb937798e96a20fd93058815bMike Dodd 2945ef376788944f9deb937798e96a20fd93058815bMike Dodd private int getAutoDisplayOrientation(int displayOrientationDegrees, 2955ef376788944f9deb937798e96a20fd93058815bMike Dodd int cameraId, android.hardware.Camera camera) { 2965ef376788944f9deb937798e96a20fd93058815bMike Dodd android.hardware.Camera.CameraInfo info = 2975ef376788944f9deb937798e96a20fd93058815bMike Dodd new android.hardware.Camera.CameraInfo(); 2985ef376788944f9deb937798e96a20fd93058815bMike Dodd android.hardware.Camera.getCameraInfo(cameraId, info); 2995ef376788944f9deb937798e96a20fd93058815bMike Dodd 3005ef376788944f9deb937798e96a20fd93058815bMike Dodd int result; 3015ef376788944f9deb937798e96a20fd93058815bMike Dodd if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 3025ef376788944f9deb937798e96a20fd93058815bMike Dodd result = (info.orientation + displayOrientationDegrees) % 360; 3035ef376788944f9deb937798e96a20fd93058815bMike Dodd result = (360 - result) % 360; // compensate the mirror 3045ef376788944f9deb937798e96a20fd93058815bMike Dodd } else { // back-facing 3055ef376788944f9deb937798e96a20fd93058815bMike Dodd result = (info.orientation - displayOrientationDegrees + 360) % 360; 3065ef376788944f9deb937798e96a20fd93058815bMike Dodd } 3075ef376788944f9deb937798e96a20fd93058815bMike Dodd return result; 3085ef376788944f9deb937798e96a20fd93058815bMike Dodd } 3095ef376788944f9deb937798e96a20fd93058815bMike Dodd 3101c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd protected void TestCamera(int whichCamera, 3111c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int width, int height, 3121c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int frameRate, 3131c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd List<Integer> setDisplayOrentationAngles) { 314d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd String baseStatus = "Camera id " + whichCamera + " " + 315d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd width + "x" + height + " " + 316d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd frameRate + "fps"; 317d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Initializing " + baseStatus); 318d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd String status = ""; 319d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd boolean succeeded = true; 320d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, "Start test -- id " + whichCamera + " " + width + "x" + height + 321d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd " " + frameRate + "fps"); 322d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Camera camera; 323430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd FrameLayout previewBlock = (FrameLayout)findViewById(R.id.previewFrame); 324430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd SurfaceTextureView surfaceTextureView = null; 325430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd CameraPreviewView previewView = null; 326430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 327430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView = (SurfaceTextureView)previewBlock.getChildAt(0); 328430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 329430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd previewView = (CameraPreviewView)previewBlock.getChildAt(0); 330430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 331d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 332d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera = Camera.open(whichCamera); 333d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Opened " + baseStatus); 334d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd try { 335d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd try { 336430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 337430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd camera.setPreviewTexture(surfaceTextureView.getSurfaceTexture()); 338430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 339430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd camera.setPreviewDisplay(previewView.mHolder); 340430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 341d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } catch (IOException exception) { 342d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 343d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status = exception.toString(); 344d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd return; 345d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 346d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 347d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.setPreviewCallbackWithBuffer(null); 348d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Camera.Parameters parameters = camera.getParameters(); 349d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 350202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd publishProgress("Changing preview parameters " + width + "x" + height + baseStatus); 351d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 352d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters.setPreviewSize(width, height); 353d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters.setPreviewFormat(ImageFormat.NV21); 354d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 355d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters.setPreviewFrameRate(frameRate); 356d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.setParameters(parameters); 357d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 358d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Validating preview parameters " + baseStatus); 359d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 360d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters = camera.getParameters(); 361d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Size setSize = parameters.getPreviewSize(); 362d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (setSize.width != width || setSize.height != height) { 363d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status += "Bad reported size, wanted " + width + "x" + height + ", got " + 364d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd setSize.width + "x" + setSize.height; 365d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 366d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 367d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 368d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (parameters.getPreviewFrameRate() != frameRate) { 369d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status += "Bad reported frame rate, wanted " + frameRate 370d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd + ", got " + parameters.getPreviewFrameRate(); 371d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 372d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 373d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 374d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Initializing callback buffers " + baseStatus); 375d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd int imageFormat = parameters.getPreviewFormat(); 376202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd if (imageFormat != ImageFormat.NV21) { 377202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd status = "Bad reported image format, wanted NV21 (" + ImageFormat.NV21 + 378202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd ") got " + imageFormat; 379202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd succeeded = false; 380202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd throw new UnsupportedOperationException(status); 381202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 382d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd int bufferSize; 383d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd bufferSize = setSize.width * setSize.height 384d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * ImageFormat.getBitsPerPixel(imageFormat) / 8; 385202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd int sizeWeShouldHave = (width * height * 3 / 2); 386202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd if (bufferSize != sizeWeShouldHave) { 387202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd status = "Bad calculate size. Should have been " + (width * height * 3 / 2) + 388202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd " but got " + imageFormat; 389202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd succeeded = false; 390202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd throw new UnsupportedOperationException(status); 391202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 392d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 393d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd FrameCatcher catcher = new FrameCatcher(setSize.width, setSize.height); 394d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 395d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (succeeded) { 396d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Starting " + baseStatus); 397d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } else { 398d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Starting " + baseStatus + " -- but " + status); 399d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 4001c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 4011c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int numPasses; 4021c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd boolean doSetDisplayOrientation; 4031c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (setDisplayOrentationAngles == null || setDisplayOrentationAngles.size() == 0) { 4041c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd numPasses = 1; 4051c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd doSetDisplayOrientation = false; 4061c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } else { 4071c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd numPasses = setDisplayOrentationAngles.size(); 4081c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd doSetDisplayOrientation = true; 4091c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 4101c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 4111c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd for (int i = 0; i < numPasses; i++) { 4121c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (doSetDisplayOrientation) { 4131c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int rotation = setDisplayOrentationAngles.get(i); 4145ef376788944f9deb937798e96a20fd93058815bMike Dodd if (rotation == -1) { 4155ef376788944f9deb937798e96a20fd93058815bMike Dodd rotation = getAutoDisplayOrientation(mDisplayOrientation, 4165ef376788944f9deb937798e96a20fd93058815bMike Dodd whichCamera, camera); 4175ef376788944f9deb937798e96a20fd93058815bMike Dodd } 4181c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd publishProgress("setDisplayOrientation to " + rotation); 4191c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd try { 4201c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.setDisplayOrientation(rotation); 4211c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } catch (RuntimeException exception) { 4221c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd succeeded = false; 4231c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd status = exception.toString(); 4241c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd return; 4251c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 4261c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 427430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 428430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView.resetFrameCounter(); 429430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView.setCameraEnabled(true); 430430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 431430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd setupCallback(camera, catcher, bufferSize); 432430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 4331c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.startPreview(); 4341c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd try { 4351c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd Thread.sleep(5000); 4361c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } catch (InterruptedException exception) { 4371c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd succeeded = false; 4381c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd status = exception.toString(); 4391c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd return; 4401c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 441430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 442430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView.setCameraEnabled(false); 443430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 444430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd camera.setPreviewCallbackWithBuffer(null); 445430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 4461c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.stopPreview(); 447d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 448d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 449430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd int frames; 450430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 451430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd frames = surfaceTextureView.getFrameCounter(); 452430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 453430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd frames = catcher.mFrames; 454430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 455430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (frames == 0) { 456d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 457d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Preview callback received no frames from " + baseStatus); 458d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } else { 459430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd publishProgress("Preview callback got " + frames + " frames (~" + 460430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd Math.round(((double)frames)/(5.0 * numPasses)) + "fps) " + 4611c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd baseStatus); 462d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 463d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd try { 464d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.setPreviewDisplay(null); 465d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } catch (IOException exception) { 466d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 467d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status = exception.toString(); 468d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd return; 469d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 470d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } finally { 471d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, "Releasing camera"); 472d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 473d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (succeeded) { 474d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Success " + baseStatus); 475d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } else { 476d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Finished " + baseStatus + " -- but " + status); 477d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 478d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 479d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.release(); 480d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 481d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 482d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 483d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 484d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd protected void onProgressUpdate(String... message) { 485d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, message[0]); 486d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatus.setText(message[0]); 487d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatusHistory.append(message[0] + "\r\n"); 488d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 489d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 490d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd} 491