1ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu/* 2ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Copyright (C) 2009 The Android Open Source Project 3ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * 4ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * you may not use this file except in compliance with the License. 6ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * You may obtain a copy of the License at 7ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * 8ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * http://www.apache.org/licenses/LICENSE-2.0 9ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * 10ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Unless required by applicable law or agreed to in writing, software 11ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * distributed under the License is distributed on an "AS IS" BASIS, 12ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * See the License for the specific language governing permissions and 14ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * limitations under the License. 15ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu */ 16ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 17ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liupackage com.android.camera.stress; 18ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 19ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport com.android.camera.CameraActivity; 20ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 21ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.app.Instrumentation; 22ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.os.Environment; 23ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.test.ActivityInstrumentationTestCase2; 24ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.test.suitebuilder.annotation.LargeTest; 25ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.util.Log; 26ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.view.KeyEvent; 27ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 28ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport java.io.BufferedWriter; 29ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport java.io.FileWriter; 30ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 31ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu/** 32ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Junit / Instrumentation test case for camera test 33ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * 34ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu */ 35ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 36ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liupublic class CameraLatency extends ActivityInstrumentationTestCase2 <CameraActivity> { 37ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private String TAG = "CameraLatency"; 38ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private static final int TOTAL_NUMBER_OF_IMAGECAPTURE = 20; 39ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private static final long WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN = 4000; 40ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private static final String CAMERA_TEST_OUTPUT_FILE = 41ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt"; 42ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 43ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mTotalAutoFocusTime; 44ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mTotalShutterLag; 45ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mTotalShutterToPictureDisplayedTime; 46ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mTotalPictureDisplayedToJpegCallbackTime; 47ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mTotalJpegCallbackFinishTime; 48ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mAvgAutoFocusTime; 49ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mAvgShutterLag = mTotalShutterLag; 50ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mAvgShutterToPictureDisplayedTime; 51ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mAvgPictureDisplayedToJpegCallbackTime; 52ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu private long mAvgJpegCallbackFinishTime; 53ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 54ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu public CameraLatency() { 55ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu super(CameraActivity.class); 56ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 57ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 58ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu @Override 59ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu protected void setUp() throws Exception { 60ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu getActivity(); 61ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu super.setUp(); 62ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 63ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 64ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu @Override 65ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu protected void tearDown() throws Exception { 66ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu super.tearDown(); 67ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 68ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 69ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu @LargeTest 70ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu public void testImageCapture() { 71ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "start testImageCapture test"); 72ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Instrumentation inst = getInstrumentation(); 73ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN); 74ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu try { 75ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu for (int i = 0; i < TOTAL_NUMBER_OF_IMAGECAPTURE; i++) { 76ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 77ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); 78ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 79ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu //skip the first measurement 80ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu if (i != 0) { 81ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu CameraActivity c = getActivity(); 82ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 83ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu // if any of the latency var accessor methods return -1 then the 84ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu // camera is set to a different module other than PhotoModule so 85ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu // skip the shot and try again 86ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu if (c.getAutoFocusTime() != -1) { 87ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalAutoFocusTime += c.getAutoFocusTime(); 88ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalShutterLag += c.getShutterLag(); 89ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalShutterToPictureDisplayedTime += 90ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu c.getShutterToPictureDisplayedTime(); 91ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalPictureDisplayedToJpegCallbackTime += 92ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu c.getPictureDisplayedToJpegCallbackTime(); 93ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalJpegCallbackFinishTime += c.getJpegCallbackFinishTime(); 94ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 95ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu else { 96ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu i--; 97ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu continue; 98ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 99ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 100ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 101ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } catch (Exception e) { 102ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "Got exception", e); 103ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 104ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu //ToDO: yslau 105ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu //1) Need to get the baseline from the cupcake so that we can add the 106ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu //failure condition of the camera latency. 107ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu //2) Only count those number with succesful capture. Set the timer to invalid 108ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu //before capture and ignore them if the value is invalid 109ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu int numberofRun = TOTAL_NUMBER_OF_IMAGECAPTURE - 1; 110ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mAvgAutoFocusTime = mTotalAutoFocusTime / numberofRun; 111ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mAvgShutterLag = mTotalShutterLag / numberofRun; 112ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mAvgShutterToPictureDisplayedTime = 113ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalShutterToPictureDisplayedTime / numberofRun; 114ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mAvgPictureDisplayedToJpegCallbackTime = 115ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalPictureDisplayedToJpegCallbackTime / numberofRun; 116ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mAvgJpegCallbackFinishTime = 117ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mTotalJpegCallbackFinishTime / numberofRun; 118ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 119ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu try { 120ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu FileWriter fstream = null; 121ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true); 122ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu BufferedWriter out = new BufferedWriter(fstream); 123ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Camera Latency : \n"); 124ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Number of loop: " + TOTAL_NUMBER_OF_IMAGECAPTURE + "\n"); 125ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Avg AutoFocus = " + mAvgAutoFocusTime + "\n"); 126ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Avg mShutterLag = " + mAvgShutterLag + "\n"); 127ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Avg mShutterToPictureDisplayedTime = " 128ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu + mAvgShutterToPictureDisplayedTime + "\n"); 129ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Avg mPictureDisplayedToJpegCallbackTime = " 130ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu + mAvgPictureDisplayedToJpegCallbackTime + "\n"); 131ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.write("Avg mJpegCallbackFinishTime = " + 132ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu mAvgJpegCallbackFinishTime + "\n"); 133ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu out.close(); 134ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu fstream.close(); 135ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } catch (Exception e) { 136ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu fail("Camera Latency write output to file"); 137ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 138ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "The Image capture wait time = " + 139ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 140ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "Avg AutoFocus = " + mAvgAutoFocusTime); 141ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "Avg mShutterLag = " + mAvgShutterLag); 142ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "Avg mShutterToPictureDisplayedTime = " 143ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu + mAvgShutterToPictureDisplayedTime); 144ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "Avg mPictureDisplayedToJpegCallbackTime = " 145ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu + mAvgPictureDisplayedToJpegCallbackTime); 146ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu Log.v(TAG, "Avg mJpegCallbackFinishTime = " + mAvgJpegCallbackFinishTime); 147ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu } 148ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu} 149ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu 150