181883e5717ca215fa1f2b104912701f830829642Mike Dodd// Copyright 2010 Google Inc. 281883e5717ca215fa1f2b104912701f830829642Mike Dodd// All Rights Reserved. 3d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 4d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpackage com.example.android.videochatcameratest; 5d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 6d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.app.Activity; 7d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.graphics.ImageFormat; 8d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera; 9d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera.Size; 10d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.AsyncTask; 11d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.Bundle; 12d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.util.Log; 135ef376788944f9deb937798e96a20fd93058815bMike Doddimport android.view.Surface; 14430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.view.TextureView; 15d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View; 16d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View.OnClickListener; 17f5959cb49b5186b9dbd18488341adeab70307e48Mike Doddimport android.view.Window; 18f5959cb49b5186b9dbd18488341adeab70307e48Mike Doddimport android.view.WindowManager; 19d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.Button; 20d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.CheckBox; 21430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.widget.FrameLayout; 22d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.TextView; 23d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 24d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport java.io.IOException; 25202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Doddimport java.lang.UnsupportedOperationException; 261c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.ArrayList; 271c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.List; 28d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 29d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpublic class VideoChatTestActivity extends Activity { 30d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 31d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd static final private int NUM_CAMERA_PREVIEW_BUFFERS = 2; 32430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd static final boolean sRunningOnHoneycomb; 33d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd static final private String TAG = "VideoChatTest"; 34202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd TextView mTextStatusHistory; 35430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd static { 36430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd sRunningOnHoneycomb = 37430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB; 38430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 39430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd 40d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public VideoChatTestActivity() { 41d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 42d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 43d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd /** Called with the activity is first created. */ 44d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 45d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public void onCreate(Bundle savedInstanceState) { 46d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd super.onCreate(savedInstanceState); 47d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 48f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd Window window = getWindow(); 49f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd window.setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 50f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 51f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd 52d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd // Inflate our UI from its XML layout description. 53d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd setContentView(R.layout.videochatcameratest_activity); 54d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 55430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd FrameLayout fl = (FrameLayout)findViewById(R.id.previewFrame); 56430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd 57430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 58430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd fl.addView(new SurfaceTextureView(this)); 59430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 60430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd fl.addView(new CameraPreviewView(this)); 61430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 62430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd 63d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd ((Button) findViewById(R.id.gobutton)).setOnClickListener(mGoListener); 64d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 65d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd ((TextView)findViewById(R.id.statushistory)).setVerticalScrollBarEnabled(true); 66202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd mTextStatusHistory = (TextView) findViewById(R.id.statushistory); 67d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 685ef376788944f9deb937798e96a20fd93058815bMike Dodd logMessage("Display Orientation " + getDisplayOrientation()); 69202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (int i = 0; i < Camera.getNumberOfCameras(); i++) { 70202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd dumpCameraCaps(i); 71202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 72d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 73d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 74202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd private void logMessage(String message) { 75202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Log.v(TAG, message); 76202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd mTextStatusHistory.append(message + "\r\n"); 77202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 78202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd 79202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd public int getCameraOrientation(int id) { 80202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera.CameraInfo info = 81202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd new Camera.CameraInfo(); 82202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera.getCameraInfo(id, info); 83202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd return info.orientation; 84202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 85202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd 86202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd private void dumpCameraCaps(int id) { 87202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera cam = Camera.open(id); 88202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd Camera.Parameters params = cam.getParameters(); 89202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd List<Integer> formats = params.getSupportedPreviewFormats(); 90202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd List<int[]> frameRates = params.getSupportedPreviewFpsRange(); 91202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd List<Camera.Size> sizes = params.getSupportedPreviewSizes(); 92202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("Camera " + id); 93202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("Orientation " + getCameraOrientation(id)); 94202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("Sizes"); 95202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (Size size : sizes) { 96202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage(size.width + "x" + size.height); 97202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 98202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("frameRates"); 99202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (int[] rates : frameRates) { 100202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage(rates[0] + "-" + rates[1]); 101202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 102202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage("formats"); 103202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd for (Integer format : formats) { 104202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd logMessage(format.toString()); 105202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 106202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd cam.release(); 107202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 108d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd /** 109d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Called when the activity is about to start interacting with the user. 110d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */ 111d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 112d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd protected void onResume() { 113d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd super.onResume(); 114d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 115d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 1165ef376788944f9deb937798e96a20fd93058815bMike Dodd private int getDisplayOrientation() { 1175ef376788944f9deb937798e96a20fd93058815bMike Dodd int rotation = getWindowManager().getDefaultDisplay().getRotation(); 1185ef376788944f9deb937798e96a20fd93058815bMike Dodd int degrees = 0; 1195ef376788944f9deb937798e96a20fd93058815bMike Dodd switch (rotation) { 1205ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_0: 1215ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 0; 1225ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1235ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_90: 1245ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 90; 1255ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1265ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_180: 1275ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 180; 1285ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1295ef376788944f9deb937798e96a20fd93058815bMike Dodd case Surface.ROTATION_270: 1305ef376788944f9deb937798e96a20fd93058815bMike Dodd degrees = 270; 1315ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 1325ef376788944f9deb937798e96a20fd93058815bMike Dodd } 1335ef376788944f9deb937798e96a20fd93058815bMike Dodd return degrees; 1345ef376788944f9deb937798e96a20fd93058815bMike Dodd } 1355ef376788944f9deb937798e96a20fd93058815bMike Dodd 136d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd /** 137d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * A call-back for when the user presses the back button. 138d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */ 139d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd OnClickListener mGoListener = new OnClickListener() { 1405ef376788944f9deb937798e96a20fd93058815bMike Dodd @Override 141d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public void onClick(View v) { 1425ef376788944f9deb937798e96a20fd93058815bMike Dodd int degrees = getDisplayOrientation(); 1435ef376788944f9deb937798e96a20fd93058815bMike Dodd new CameraTestRunner().execute(new Integer[] { degrees }); 144d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 145d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd }; 146d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 1475ef376788944f9deb937798e96a20fd93058815bMike Dodd private class CameraTestRunner extends AsyncTask<Integer, String, Void> { 148d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 149d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd TextView mTextStatus; 1505ef376788944f9deb937798e96a20fd93058815bMike Dodd private int mDisplayOrientation; 151f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd private volatile boolean mClearStatusOnNextUpdate; 152d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 153d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 1545ef376788944f9deb937798e96a20fd93058815bMike Dodd protected Void doInBackground(Integer... params) { 1555ef376788944f9deb937798e96a20fd93058815bMike Dodd mDisplayOrientation = params[0]; 156897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd mTextStatus = (TextView) findViewById(R.id.status); 157897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testFrontCamera = 158897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd ((CheckBox) findViewById(R.id.frontcameracheckbox)).isChecked(); 159897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testBackCamera = ((CheckBox) findViewById(R.id.backcameracheckbox)).isChecked(); 160897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testQVGA = ((CheckBox) findViewById(R.id.qvgacheckbox)).isChecked(); 161897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testVGA = ((CheckBox) findViewById(R.id.vgacheckbox)).isChecked(); 162897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean test15fps = ((CheckBox) findViewById(R.id.fps15checkbox)).isChecked(); 163897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean test30fps = ((CheckBox) findViewById(R.id.fps30checkbox)).isChecked(); 164897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate0 = ((CheckBox) findViewById(R.id.rotate0checkbox)).isChecked(); 165897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate90 = ((CheckBox) findViewById(R.id.rotate90checkbox)).isChecked(); 166897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate180 = ((CheckBox) findViewById(R.id.rotate180checkbox)).isChecked(); 167897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd boolean testRotate270 = ((CheckBox) findViewById(R.id.rotate270checkbox)).isChecked(); 1685ef376788944f9deb937798e96a20fd93058815bMike Dodd boolean testRotateAuto = ((CheckBox) findViewById(R.id.rotateautocheckbox)).isChecked(); 1691c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 1701c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd ArrayList<Integer> setDisplayOrentationAngles = new ArrayList<Integer>(); 1711c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 1721c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate0) { 1731c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(0); 1741c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1751c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate90) { 1761c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(90); 1771c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1781c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate180) { 1791c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(180); 1801c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1811c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (testRotate270) { 1821c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd setDisplayOrentationAngles.add(270); 1831c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 1845ef376788944f9deb937798e96a20fd93058815bMike Dodd if (testRotateAuto) { 1855ef376788944f9deb937798e96a20fd93058815bMike Dodd setDisplayOrentationAngles.add(-1); 1865ef376788944f9deb937798e96a20fd93058815bMike Dodd } 187d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 188897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd final int widths[] = new int[] {320, 640}; 189897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd final int heights[] = new int[] {240, 480}; 190d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 191897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd final int framerates[] = new int[] {15, 30}; 192d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 1935ef376788944f9deb937798e96a20fd93058815bMike Dodd ArrayList<Integer> whichCameras = new ArrayList<Integer>(); 1945ef376788944f9deb937798e96a20fd93058815bMike Dodd int numCameras = Camera.getNumberOfCameras(); 1955ef376788944f9deb937798e96a20fd93058815bMike Dodd if (testFrontCamera) { 1965ef376788944f9deb937798e96a20fd93058815bMike Dodd for (int i = 0; i < numCameras; i++) { 1975ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.CameraInfo info = new Camera.CameraInfo(); 1985ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.getCameraInfo(i, info); 1995ef376788944f9deb937798e96a20fd93058815bMike Dodd if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 2005ef376788944f9deb937798e96a20fd93058815bMike Dodd whichCameras.add(i); 2015ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 202d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 2035ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2045ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2055ef376788944f9deb937798e96a20fd93058815bMike Dodd if (testBackCamera) { 2065ef376788944f9deb937798e96a20fd93058815bMike Dodd for (int i = 0; i < numCameras; i++) { 2075ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.CameraInfo info = new Camera.CameraInfo(); 2085ef376788944f9deb937798e96a20fd93058815bMike Dodd Camera.getCameraInfo(i, info); 2095ef376788944f9deb937798e96a20fd93058815bMike Dodd if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 2105ef376788944f9deb937798e96a20fd93058815bMike Dodd whichCameras.add(i); 2115ef376788944f9deb937798e96a20fd93058815bMike Dodd break; 212d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 2135ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2145ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2155ef376788944f9deb937798e96a20fd93058815bMike Dodd do { 216f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd mClearStatusOnNextUpdate = true; 2175ef376788944f9deb937798e96a20fd93058815bMike Dodd for (Integer whichCamera : whichCameras) { 218897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd for (int whichResolution = 0; whichResolution < 2; whichResolution++) { 219897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichResolution == 0 && !testQVGA) { 220d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd continue; 221d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 222897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichResolution == 1 && !testVGA) { 223d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd continue; 224d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 225d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 226897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd for (int whichFramerate = 0; whichFramerate < 2; whichFramerate++) { 227897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichFramerate == 0 && !test15fps) { 228897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd continue; 229897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } 230897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd if (whichFramerate == 1 && !test30fps) { 231897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd continue; 232897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } 233897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd 234897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd TestCamera(whichCamera, widths[whichResolution], 235897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd heights[whichResolution], framerates[whichFramerate], 236897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd setDisplayOrentationAngles); 237897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } 238d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 239d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 240897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd } while (((CheckBox) findViewById(R.id.repeatcheckbox)).isChecked()); 241d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd // start tests 242d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 243d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd return null; 244d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 245d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 246d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 247d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd protected void onPostExecute(Void result) { 248d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd final String allDoneString = "Test complete"; 249d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, allDoneString); 250d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatus.setText(allDoneString); 251d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatusHistory.append(allDoneString + "\r\n"); 252d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 253d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 254d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 255d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd private class FrameCatcher implements Camera.PreviewCallback { 256d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public int mFrames = 0; 257202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd private final int mExpectedSize; 258d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public FrameCatcher(int width, int height) { 259202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd mExpectedSize = width * height * 3 / 2; 260d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 261d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 262d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 263d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd public void onPreviewFrame(byte[] data, Camera camera) { 264202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd if (mExpectedSize != data.length) { 265202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd throw new UnsupportedOperationException("bad size, got " + data.length + " expected " + mExpectedSize); 266202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 267d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mFrames++; 268d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.addCallbackBuffer(data); 269d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 270d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 271d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 2721c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 2731c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd private void setupCallback(Camera camera, FrameCatcher catcher, int bufferSize) { 2741c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.setPreviewCallbackWithBuffer(null); 2751c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.setPreviewCallbackWithBuffer(catcher); 2761c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd for (int i = 0; i < NUM_CAMERA_PREVIEW_BUFFERS; i++) { 2771c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd byte [] cameraBuffer = new byte[bufferSize]; 2781c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.addCallbackBuffer(cameraBuffer); 2791c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 2801c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 2815ef376788944f9deb937798e96a20fd93058815bMike Dodd 2825ef376788944f9deb937798e96a20fd93058815bMike Dodd private int getAutoDisplayOrientation(int displayOrientationDegrees, 2835ef376788944f9deb937798e96a20fd93058815bMike Dodd int cameraId, android.hardware.Camera camera) { 2845ef376788944f9deb937798e96a20fd93058815bMike Dodd android.hardware.Camera.CameraInfo info = 2855ef376788944f9deb937798e96a20fd93058815bMike Dodd new android.hardware.Camera.CameraInfo(); 2865ef376788944f9deb937798e96a20fd93058815bMike Dodd android.hardware.Camera.getCameraInfo(cameraId, info); 2875ef376788944f9deb937798e96a20fd93058815bMike Dodd 2885ef376788944f9deb937798e96a20fd93058815bMike Dodd int result; 2895ef376788944f9deb937798e96a20fd93058815bMike Dodd if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 2905ef376788944f9deb937798e96a20fd93058815bMike Dodd result = (info.orientation + displayOrientationDegrees) % 360; 2915ef376788944f9deb937798e96a20fd93058815bMike Dodd result = (360 - result) % 360; // compensate the mirror 2925ef376788944f9deb937798e96a20fd93058815bMike Dodd } else { // back-facing 2935ef376788944f9deb937798e96a20fd93058815bMike Dodd result = (info.orientation - displayOrientationDegrees + 360) % 360; 2945ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2955ef376788944f9deb937798e96a20fd93058815bMike Dodd return result; 2965ef376788944f9deb937798e96a20fd93058815bMike Dodd } 2975ef376788944f9deb937798e96a20fd93058815bMike Dodd 2981c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd protected void TestCamera(int whichCamera, 2991c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int width, int height, 3001c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int frameRate, 3011c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd List<Integer> setDisplayOrentationAngles) { 302d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd String baseStatus = "Camera id " + whichCamera + " " + 303d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd width + "x" + height + " " + 304d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd frameRate + "fps"; 305d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Initializing " + baseStatus); 306d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd String status = ""; 307d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd boolean succeeded = true; 308d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, "Start test -- id " + whichCamera + " " + width + "x" + height + 309d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd " " + frameRate + "fps"); 310d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Camera camera; 311430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd FrameLayout previewBlock = (FrameLayout)findViewById(R.id.previewFrame); 312430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd SurfaceTextureView surfaceTextureView = null; 313430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd CameraPreviewView previewView = null; 314430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 315430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView = (SurfaceTextureView)previewBlock.getChildAt(0); 316430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 317430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd previewView = (CameraPreviewView)previewBlock.getChildAt(0); 318430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 319d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 320d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera = Camera.open(whichCamera); 321d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Opened " + baseStatus); 322d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd try { 323d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd try { 324430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 325430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd camera.setPreviewTexture(surfaceTextureView.getSurfaceTexture()); 326430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 327430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd camera.setPreviewDisplay(previewView.mHolder); 328430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 329d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } catch (IOException exception) { 330d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 331d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status = exception.toString(); 332d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd return; 333d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 334d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 335d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.setPreviewCallbackWithBuffer(null); 336d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Camera.Parameters parameters = camera.getParameters(); 337d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 338202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd publishProgress("Changing preview parameters " + width + "x" + height + baseStatus); 339d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 340d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters.setPreviewSize(width, height); 341d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters.setPreviewFormat(ImageFormat.NV21); 342d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 343d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters.setPreviewFrameRate(frameRate); 344d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.setParameters(parameters); 345d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 346d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Validating preview parameters " + baseStatus); 347d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 348d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd parameters = camera.getParameters(); 349d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Size setSize = parameters.getPreviewSize(); 350d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (setSize.width != width || setSize.height != height) { 351d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status += "Bad reported size, wanted " + width + "x" + height + ", got " + 352d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd setSize.width + "x" + setSize.height; 353d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 354d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 355d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 356d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (parameters.getPreviewFrameRate() != frameRate) { 357d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status += "Bad reported frame rate, wanted " + frameRate 358d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd + ", got " + parameters.getPreviewFrameRate(); 359d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 360d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 361d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 362d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Initializing callback buffers " + baseStatus); 363d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd int imageFormat = parameters.getPreviewFormat(); 364202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd if (imageFormat != ImageFormat.NV21) { 365202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd status = "Bad reported image format, wanted NV21 (" + ImageFormat.NV21 + 366202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd ") got " + imageFormat; 367202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd succeeded = false; 368202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd throw new UnsupportedOperationException(status); 369202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 370d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd int bufferSize; 371d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd bufferSize = setSize.width * setSize.height 372d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * ImageFormat.getBitsPerPixel(imageFormat) / 8; 373202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd int sizeWeShouldHave = (width * height * 3 / 2); 374202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd if (bufferSize != sizeWeShouldHave) { 375202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd status = "Bad calculate size. Should have been " + (width * height * 3 / 2) + 376202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd " but got " + imageFormat; 377202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd succeeded = false; 378202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd throw new UnsupportedOperationException(status); 379202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd } 380d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 381d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd FrameCatcher catcher = new FrameCatcher(setSize.width, setSize.height); 382d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 383d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (succeeded) { 384d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Starting " + baseStatus); 385d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } else { 386d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Starting " + baseStatus + " -- but " + status); 387d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 3881c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 3891c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int numPasses; 3901c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd boolean doSetDisplayOrientation; 3911c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (setDisplayOrentationAngles == null || setDisplayOrentationAngles.size() == 0) { 3921c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd numPasses = 1; 3931c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd doSetDisplayOrientation = false; 3941c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } else { 3951c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd numPasses = setDisplayOrentationAngles.size(); 3961c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd doSetDisplayOrientation = true; 3971c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 3981c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd 3991c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd for (int i = 0; i < numPasses; i++) { 4001c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd if (doSetDisplayOrientation) { 4011c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd int rotation = setDisplayOrentationAngles.get(i); 4025ef376788944f9deb937798e96a20fd93058815bMike Dodd if (rotation == -1) { 4035ef376788944f9deb937798e96a20fd93058815bMike Dodd rotation = getAutoDisplayOrientation(mDisplayOrientation, 4045ef376788944f9deb937798e96a20fd93058815bMike Dodd whichCamera, camera); 4055ef376788944f9deb937798e96a20fd93058815bMike Dodd } 4061c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd publishProgress("setDisplayOrientation to " + rotation); 4071c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd try { 4081c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.setDisplayOrientation(rotation); 4091c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } catch (RuntimeException exception) { 4101c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd succeeded = false; 4111c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd status = exception.toString(); 4121c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd return; 4131c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 4141c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 415430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 416430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView.resetFrameCounter(); 417430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView.setCameraEnabled(true); 418430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 419430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd setupCallback(camera, catcher, bufferSize); 420430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 4211c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.startPreview(); 4221c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd try { 4231c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd Thread.sleep(5000); 4241c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } catch (InterruptedException exception) { 4251c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd succeeded = false; 4261c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd status = exception.toString(); 4271c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd return; 4281c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd } 429430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 430430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd surfaceTextureView.setCameraEnabled(false); 431430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 432430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd camera.setPreviewCallbackWithBuffer(null); 433430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 4341c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd camera.stopPreview(); 435d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 436d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 437430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd int frames; 438430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (sRunningOnHoneycomb) { 439430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd frames = surfaceTextureView.getFrameCounter(); 440430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } else { 441430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd frames = catcher.mFrames; 442430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd } 443430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd if (frames == 0) { 444d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 445d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Preview callback received no frames from " + baseStatus); 446d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } else { 447430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd publishProgress("Preview callback got " + frames + " frames (~" + 448430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd Math.round(((double)frames)/(5.0 * numPasses)) + "fps) " + 4491c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd baseStatus); 450d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 451d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd try { 452d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.setPreviewDisplay(null); 453d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } catch (IOException exception) { 454d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd succeeded = false; 455d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd status = exception.toString(); 456d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd return; 457d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 458d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } finally { 459d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, "Releasing camera"); 460d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 461d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd if (succeeded) { 462d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Success " + baseStatus); 463d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } else { 464d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd publishProgress("Finished " + baseStatus + " -- but " + status); 465d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 466d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 467d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd camera.release(); 468d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 469d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 470d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd 471d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd @Override 472d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd protected void onProgressUpdate(String... message) { 473f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd if (mClearStatusOnNextUpdate) { 474f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd mClearStatusOnNextUpdate = false; 475f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd mTextStatusHistory.setText(""); 476f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd } 477d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd Log.v(TAG, message[0]); 478d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatus.setText(message[0]); 479d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd mTextStatusHistory.append(message[0] + "\r\n"); 480d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 481d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd } 482d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd} 483