CameraStressTest.java revision bac8666893ee6d0074db7fa7f995de04598013b1
141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi/* 241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Copyright (C) 2012 The Android Open Source Project 341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * 441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Licensed under the Apache License, Version 2.0 (the "License"); 541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * you may not use this file except in compliance with the License. 641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * You may obtain a copy of the License at 741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * 841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * http://www.apache.org/licenses/LICENSE-2.0 941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * 1041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Unless required by applicable law or agreed to in writing, software 1141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * distributed under the License is distributed on an "AS IS" BASIS, 1241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * See the License for the specific language governing permissions and 1441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * limitations under the License. 1541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi */ 1641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 1741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchipackage com.android.mediaframeworktest.stress; 1841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 1941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport com.android.mediaframeworktest.MediaFrameworkTest; 2041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 2141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.BufferedWriter; 2241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.File; 2341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FilenameFilter; 2441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileWriter; 2541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileNotFoundException; 2641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileOutputStream; 2741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.IOException; 2841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.Writer; 2941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.util.concurrent.Semaphore; 3041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.util.concurrent.TimeUnit; 31bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchiimport java.util.List; 3241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 3341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera; 3441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera.PictureCallback; 3541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera.ShutterCallback; 3641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Environment; 3741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Handler; 3841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Looper; 3941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.ActivityInstrumentationTestCase2; 4041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.suitebuilder.annotation.LargeTest; 4141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.util.Log; 4241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.view.SurfaceHolder; 4341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport com.android.mediaframeworktest.CameraStressTestRunner; 4441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 4541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport junit.framework.Assert; 4641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 4741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi/** 48bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi * Junit / Instrumentation test case for the camera zoom and scene mode APIs 4941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * 5041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * adb shell am instrument 5141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * -e class com.android.mediaframeworktest.stress.CameraStressTest 5241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * -w com.android.mediaframeworktest/.CameraStressTestRunner 5341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi */ 5441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchipublic class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 5541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private String TAG = "CameraStressTest"; 5641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private Camera mCamera; 5741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 58bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private static final int CAMERA_ID = 0; 5941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private static final int NUMBER_OF_ZOOM_LOOPS = 100; 60bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private static final int NUMBER_OF_SCENE_MODE_LOOPS = 10; 6141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds 6241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds 6341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds 64bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private static final String CAMERA_STRESS_IMAGES_DIRECTORY = "cameraStressImages"; 65bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private static final String CAMERA_STRESS_IMAGES_PREFIX = "camera-stress-test"; 66bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private static final String CAMERA_STRESS_OUTPUT = "cameraStressOutput.txt"; 6741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback(); 6841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 6941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private Thread mLooperThread; 7041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private Handler mHandler; 7141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 72bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private Writer mOutput; 73bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 7441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public CameraStressTest() { 7541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi super("com.android.mediaframeworktest", MediaFrameworkTest.class); 7641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 7741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 7841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi protected void setUp() throws Exception { 7941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi final Semaphore sem = new Semaphore(0); 8041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mLooperThread = new Thread() { 8141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 8241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void run() { 8341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "starting looper"); 8441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Looper.prepare(); 8541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mHandler = new Handler(); 8641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi sem.release(); 8741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Looper.loop(); 8841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "quit looper"); 8941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 9041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }; 9141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mLooperThread.start(); 9241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 9341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi fail("Failed to start the looper."); 9441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 9541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi getActivity(); 9641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi super.setUp(); 97bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 98bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi File sdcard = Environment.getExternalStorageDirectory(); 99bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 100bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi // Create the test images directory if it doesn't exist 101bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi File stressImagesDirectory = new File(String.format("%s/%s", sdcard, 102bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi CAMERA_STRESS_IMAGES_DIRECTORY)); 103bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi if (!stressImagesDirectory.exists()) { 104bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi stressImagesDirectory.mkdir(); 105bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 106bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 107bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi // Start writing output file 108bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi File stressOutFile = new File(String.format("%s/%s",sdcard, CAMERA_STRESS_OUTPUT)); 109bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput = new BufferedWriter(new FileWriter(stressOutFile, true)); 110bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write(this.getName() + ":\n"); 11141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 11241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 11341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 11441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi protected void tearDown() throws Exception { 11541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (mHandler != null) { 11641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mHandler.getLooper().quit(); 11741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mHandler = null; 11841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 11941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (mLooperThread != null) { 12041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mLooperThread.join(WAIT_TIMEOUT); 12141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (mLooperThread.isAlive()) { 12241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi fail("Failed to stop the looper."); 12341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 12441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mLooperThread = null; 12541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 12641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 127bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write("\n\n"); 128bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.close(); 129bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 13041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi super.tearDown(); 13141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 13241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 13341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private void runOnLooper(final Runnable command) throws InterruptedException { 13441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi final Semaphore sem = new Semaphore(0); 13541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mHandler.post(new Runnable() { 13641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 13741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void run() { 13841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi try { 13941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi command.run(); 14041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } finally { 14141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi sem.release(); 14241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 14341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 14441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }); 14541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 14641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi fail("Failed to run the command on the looper."); 14741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 14841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 14941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 15041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback { 15141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void onError(int error, android.hardware.Camera camera) { 152bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi fail(String.format("Camera error, code: %d", error)); 15341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 15441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 15541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 15641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private ShutterCallback shutterCallback = new ShutterCallback() { 15741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 15841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void onShutter() { 15941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "Shutter"); 16041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 16141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }; 16241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 16341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private PictureCallback rawCallback = new PictureCallback() { 16441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 16541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void onPictureTaken(byte[] data, Camera camera) { 16641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "Raw picture taken"); 16741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 16841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }; 16941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 17041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi private PictureCallback jpegCallback = new PictureCallback() { 17141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 17241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void onPictureTaken(byte[] data, Camera camera) { 17341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi FileOutputStream fos = null; 17441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 17541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi try { 17641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "JPEG picture taken"); 177bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi fos = new FileOutputStream(String.format("%s/%s/%s-%d.jpg", 178bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY, 179bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi CAMERA_STRESS_IMAGES_PREFIX, System.currentTimeMillis())); 18041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi fos.write(data); 181bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (FileNotFoundException e) { 182bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "File not found: " + e.toString()); 183bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (IOException e) { 184bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error accessing file: " + e.toString()); 185bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } finally { 18641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi try { 18741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (fos != null) { 18841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi fos.close(); 18941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 190bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (IOException e) { 191bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error closing file: " + e.toString()); 19241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 19341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 19441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 19541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }; 19641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 19741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi // Helper method for cleaning up pics taken during testStressCameraZoom 198bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private void cleanupStressTestImages() { 19941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi try { 200bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi File stressImagesDirectory = new File(String.format("%s/%s", 201bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY)); 20241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi File[] zoomImages = null; 20341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 20441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi FilenameFilter filter = new FilenameFilter() { 20541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public boolean accept(File dir, String name) { 206bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi return name.startsWith(CAMERA_STRESS_IMAGES_PREFIX); 20741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 20841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }; 20941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 210bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi zoomImages = stressImagesDirectory.listFiles(filter); 21141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 21241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi for (File f : zoomImages) { 21341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi f.delete(); 21441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 215bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (SecurityException e) { 216bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Security manager access violation: " + e.toString()); 21741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 218bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 219bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 220bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi // Helper method for starting up the camera preview 221bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private void startCameraPreview(SurfaceHolder surfaceHolder) { 222bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi try { 223bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.setErrorCallback(mCameraErrorCallback); 224bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.setPreviewDisplay(surfaceHolder); 225bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.startPreview(); 226bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Thread.sleep(WAIT_GENERIC); 227bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (IOException e) { 228bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error setting preview display: " + e.toString()); 229bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (InterruptedException e) { 230bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error waiting for preview to come up: " + e.toString()); 231bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (Exception e) { 232bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error starting up camera preview: " + e.toString()); 233bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 234bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 235bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 236bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi // Helper method for taking a photo 237bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi private void capturePhoto() { 238bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi try { 239bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); 240bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Thread.sleep(WAIT_GENERIC); 241bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.stopPreview(); 242bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.release(); 243bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (InterruptedException e) { 244bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error waiting for photo to be taken: " + e.toString()); 245bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (Exception e) { 246bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, "Error capturing photo: " + e.toString()); 24741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 24841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 24941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 25041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi // Test case for stressing the camera zoom in/out feature 25141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @LargeTest 25241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void testStressCameraZoom() throws Exception { 25341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi SurfaceHolder mSurfaceHolder; 25441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 255bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n"); 25641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 25741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi try { 25841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "Start preview"); 259bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write("No of loop: "); 26041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 261e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau mCamera = Camera.open(CAMERA_ID); 26241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Camera.Parameters params = mCamera.getParameters(); 26341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mCamera.release(); 26441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 26541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) { 26641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "Device camera does not support zoom"); 267bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi fail("Camera zoom stress test failed"); 268bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } else { 26941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "Device camera does support zoom"); 27041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 27141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi int nextZoomLevel = 0; 27241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 27341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi for (int i = 0; i < NUMBER_OF_ZOOM_LOOPS; i++) { 27441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi runOnLooper(new Runnable() { 27541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi @Override 27641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi public void run() { 277e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau mCamera = Camera.open(CAMERA_ID); 27841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 27941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi }); 28041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 281bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi startCameraPreview(mSurfaceHolder); 28241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi params = mCamera.getParameters(); 28341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi int currentZoomLevel = params.getZoom(); 28441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 28541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (nextZoomLevel >= params.getMaxZoom()) { 28641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi nextZoomLevel = 0; 28741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 28841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi ++nextZoomLevel; 28941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 29041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi if (params.isSmoothZoomSupported()) { 29141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mCamera.startSmoothZoom(nextZoomLevel); 292bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } else { 29341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi params.setZoom(nextZoomLevel); 29441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi mCamera.setParameters(params); 29541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 29641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Log.v(TAG, "Zooming from " + currentZoomLevel + " to " + nextZoomLevel); 29741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 29841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi // sleep allows for zoom animation to finish 29941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi Thread.sleep(WAIT_ZOOM_ANIMATION); 300bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi capturePhoto(); 30141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi 302bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi if (i == 0) { 303bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write(Integer.toString(i)); 304bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } else { 305bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write(", " + i); 306bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 30741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 30841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 309bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi cleanupStressTestImages(); 310bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (Exception e) { 311bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, e.toString()); 312bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi fail("Camera zoom stress test Exception"); 31341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 314bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 315bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 316bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi // Test case for stressing the camera scene mode feature 317bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi @LargeTest 318bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi public void testStressCameraSceneModes() throws Exception { 319bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi SurfaceHolder mSurfaceHolder; 320bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 321bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 322bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi try { 323bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera = Camera.open(CAMERA_ID); 324bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Camera.Parameters params = mCamera.getParameters(); 325bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.release(); 326bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi List<String> supportedSceneModes = params.getSupportedSceneModes(); 327bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi assertNotNull("No scene modes supported", supportedSceneModes); 328bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 329bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write("Total number of loops: " + 330bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi (NUMBER_OF_SCENE_MODE_LOOPS * supportedSceneModes.size()) + "\n"); 331bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.v(TAG, "Start preview"); 332bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write("No of loop: "); 333bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 334bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi for (int i = 0; i < supportedSceneModes.size(); i++) { 335bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi for (int j = 0; j < NUMBER_OF_SCENE_MODE_LOOPS; j++) { 336bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi runOnLooper(new Runnable() { 337bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi @Override 338bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi public void run() { 339bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera = Camera.open(CAMERA_ID); 340bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 341bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi }); 342bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 343bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi startCameraPreview(mSurfaceHolder); 344bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.v(TAG, "Setting mode to " + supportedSceneModes.get(i)); 345bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi params.setSceneMode(supportedSceneModes.get(i)); 346bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mCamera.setParameters(params); 347bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi capturePhoto(); 348bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi 349bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi if ((i == 0) && (j == 0)) { 350bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write(Integer.toString(j + i * NUMBER_OF_SCENE_MODE_LOOPS)); 351bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } else { 352bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi mOutput.write(", " + (j + i * NUMBER_OF_SCENE_MODE_LOOPS)); 353bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 354bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 355bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } 356bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi cleanupStressTestImages(); 357bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi } catch (Exception e) { 358bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi Log.e(TAG, e.toString()); 359bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi fail("Camera scene mode test Exception"); 36041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 36141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi } 36241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi} 363