11ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling/* 21ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Copyright (C) 2009 The Android Open Source Project 31ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * 41ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 51ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * you may not use this file except in compliance with the License. 61ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * You may obtain a copy of the License at 71ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * 81ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 91ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * 101ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Unless required by applicable law or agreed to in writing, software 111ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 121ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * See the License for the specific language governing permissions and 141ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * limitations under the License. 151ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling */ 161ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 173189c037886fda47be73da9885e6760df50efd71Jason Noguchipackage com.android.camera.stress; 181ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 191ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport com.android.camera.CameraActivity; 201ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 211ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.app.Instrumentation; 221ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.os.Environment; 231ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.test.ActivityInstrumentationTestCase2; 241ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.test.suitebuilder.annotation.LargeTest; 251ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.util.Log; 261ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.view.KeyEvent; 271ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 281ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport java.io.BufferedWriter; 291ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport java.io.FileWriter; 301ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 311ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling/** 321ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Junit / Instrumentation test case for camera test 331ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * 341ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling */ 351ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 361ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingpublic class CameraLatency extends ActivityInstrumentationTestCase2 <CameraActivity> { 371ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private String TAG = "CameraLatency"; 381ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private static final int TOTAL_NUMBER_OF_IMAGECAPTURE = 20; 391ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private static final long WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN = 4000; 401ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private static final String CAMERA_TEST_OUTPUT_FILE = 411ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt"; 421ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 431ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mTotalAutoFocusTime; 441ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mTotalShutterLag; 451ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mTotalShutterToPictureDisplayedTime; 461ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mTotalPictureDisplayedToJpegCallbackTime; 471ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mTotalJpegCallbackFinishTime; 48a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan private long mTotalFirstPreviewTime; 491ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mAvgAutoFocusTime; 501ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mAvgShutterLag = mTotalShutterLag; 511ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mAvgShutterToPictureDisplayedTime; 521ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mAvgPictureDisplayedToJpegCallbackTime; 531ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling private long mAvgJpegCallbackFinishTime; 54a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan private long mAvgFirstPreviewTime; 55a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan 561ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 571ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling public CameraLatency() { 581ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling super(CameraActivity.class); 591ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 601ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 611ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling @Override 621ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling protected void setUp() throws Exception { 631ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling getActivity(); 641ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling super.setUp(); 651ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 661ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 671ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling @Override 681ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling protected void tearDown() throws Exception { 691ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling super.tearDown(); 701ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 711ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 721ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling public void testImageCapture() { 731ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "start testImageCapture test"); 741ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Instrumentation inst = getInstrumentation(); 751ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN); 761ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling try { 771ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling for (int i = 0; i < TOTAL_NUMBER_OF_IMAGECAPTURE; i++) { 781ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 791ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); 801ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 811ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling //skip the first measurement 821ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling if (i != 0) { 831ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling CameraActivity c = getActivity(); 841ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 851ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling // if any of the latency var accessor methods return -1 then the 861ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling // camera is set to a different module other than PhotoModule so 871ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling // skip the shot and try again 881ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling if (c.getAutoFocusTime() != -1) { 891ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalAutoFocusTime += c.getAutoFocusTime(); 901ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalShutterLag += c.getShutterLag(); 911ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalShutterToPictureDisplayedTime += 921ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling c.getShutterToPictureDisplayedTime(); 931ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalPictureDisplayedToJpegCallbackTime += 941ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling c.getPictureDisplayedToJpegCallbackTime(); 951ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalJpegCallbackFinishTime += c.getJpegCallbackFinishTime(); 96a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan mTotalFirstPreviewTime += c.getFirstPreviewTime(); 971ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 981ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling else { 991ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling i--; 1001ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling continue; 1011ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 1021ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 1031ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 1041ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } catch (Exception e) { 1051ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "Got exception", e); 1061ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 1071ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling //ToDO: yslau 1081ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling //1) Need to get the baseline from the cupcake so that we can add the 1091ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling //failure condition of the camera latency. 1101ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling //2) Only count those number with succesful capture. Set the timer to invalid 1111ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling //before capture and ignore them if the value is invalid 1121ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling int numberofRun = TOTAL_NUMBER_OF_IMAGECAPTURE - 1; 1131ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mAvgAutoFocusTime = mTotalAutoFocusTime / numberofRun; 1141ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mAvgShutterLag = mTotalShutterLag / numberofRun; 1151ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mAvgShutterToPictureDisplayedTime = 1161ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalShutterToPictureDisplayedTime / numberofRun; 1171ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mAvgPictureDisplayedToJpegCallbackTime = 1181ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalPictureDisplayedToJpegCallbackTime / numberofRun; 1191ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mAvgJpegCallbackFinishTime = 1201ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mTotalJpegCallbackFinishTime / numberofRun; 121a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan mAvgFirstPreviewTime = 122a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan mTotalFirstPreviewTime / numberofRun; 1231ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 1241ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling try { 1251ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling FileWriter fstream = null; 1261ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true); 1271ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling BufferedWriter out = new BufferedWriter(fstream); 1281ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Camera Latency : \n"); 1291ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Number of loop: " + TOTAL_NUMBER_OF_IMAGECAPTURE + "\n"); 1301ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Avg AutoFocus = " + mAvgAutoFocusTime + "\n"); 1311ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Avg mShutterLag = " + mAvgShutterLag + "\n"); 1321ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Avg mShutterToPictureDisplayedTime = " 1331ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling + mAvgShutterToPictureDisplayedTime + "\n"); 1341ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Avg mPictureDisplayedToJpegCallbackTime = " 1351ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling + mAvgPictureDisplayedToJpegCallbackTime + "\n"); 1361ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.write("Avg mJpegCallbackFinishTime = " + 1371ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling mAvgJpegCallbackFinishTime + "\n"); 138a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan out.write("Avg FirstPreviewTime = " + 139a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan mAvgFirstPreviewTime + "\n"); 1401ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling out.close(); 1411ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling fstream.close(); 1421ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } catch (Exception e) { 1431ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling fail("Camera Latency write output to file"); 1441ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 1451ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "The Image capture wait time = " + 1461ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 1471ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "Avg AutoFocus = " + mAvgAutoFocusTime); 1481ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "Avg mShutterLag = " + mAvgShutterLag); 1491ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "Avg mShutterToPictureDisplayedTime = " 1501ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling + mAvgShutterToPictureDisplayedTime); 1511ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "Avg mPictureDisplayedToJpegCallbackTime = " 1521ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling + mAvgPictureDisplayedToJpegCallbackTime); 1531ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling Log.v(TAG, "Avg mJpegCallbackFinishTime = " + mAvgJpegCallbackFinishTime); 154a0e8347f9cfb583f90543635c5c86dc9252526e1Kevin Gabayan Log.v(TAG, "Avg FirstPreviewTime = " + mAvgFirstPreviewTime); 1551ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling } 1561ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling} 1571ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling 158