13ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen/* 23ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Copyright (C) 2009 The Android Open Source Project 33ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * 43ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Licensed under the Apache License, Version 2.0 (the "License"); 53ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * you may not use this file except in compliance with the License. 63ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * You may obtain a copy of the License at 73ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * 83ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * http://www.apache.org/licenses/LICENSE-2.0 93ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * 103ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Unless required by applicable law or agreed to in writing, software 113ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * distributed under the License is distributed on an "AS IS" BASIS, 123ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * See the License for the specific language governing permissions and 143ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * limitations under the License. 153ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen */ 163ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 173ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenpackage com.android.camera.stress; 183ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 193ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport com.android.camera.Camera; 203ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 213ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.app.Instrumentation; 223e2d95456def6a6d6e716af77e4708a15747d2edRay Chenimport android.os.Environment; 233ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.test.ActivityInstrumentationTestCase2; 243ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.test.suitebuilder.annotation.LargeTest; 253ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.util.Log; 263ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.view.KeyEvent; 273ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 283e2d95456def6a6d6e716af77e4708a15747d2edRay Chenimport java.io.BufferedWriter; 293e2d95456def6a6d6e716af77e4708a15747d2edRay Chenimport java.io.FileWriter; 303e2d95456def6a6d6e716af77e4708a15747d2edRay Chen 313ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen/** 323ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Junit / Instrumentation test case for camera test 333ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * 343ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen */ 353ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 363ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenpublic class CameraLatency extends ActivityInstrumentationTestCase2 <Camera> { 373ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen private String TAG = "CameraLatency"; 3811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau private static final int TOTAL_NUMBER_OF_IMAGECAPTURE = 20; 39154d112a5ac848e986ed9c13f97b195f004bc151Yu Shan Emily Lau private static final long WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN = 4000; 403e2d95456def6a6d6e716af77e4708a15747d2edRay Chen private static final String CAMERA_TEST_OUTPUT_FILE = 413e2d95456def6a6d6e716af77e4708a15747d2edRay Chen Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt"; 423ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 4311cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau private long mTotalAutoFocusTime; 4411cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau private long mTotalShutterLag; 459324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li private long mTotalShutterToPictureDisplayedTime; 469324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li private long mTotalPictureDisplayedToJpegCallbackTime; 47e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li private long mTotalJpegCallbackFinishTime; 4811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau private long mAvgAutoFocusTime; 4911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau private long mAvgShutterLag = mTotalShutterLag; 509324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li private long mAvgShutterToPictureDisplayedTime; 519324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li private long mAvgPictureDisplayedToJpegCallbackTime; 52e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li private long mAvgJpegCallbackFinishTime; 5311cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau 543ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen public CameraLatency() { 55559f5cf9f42c4983eaef9e6e55ff3ba7c406426aWu-cheng Li super(Camera.class); 563ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } 573ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 583ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen @Override 593ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen protected void setUp() throws Exception { 603ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen getActivity(); 613ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen super.setUp(); 623ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } 633ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 643ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen @Override 653ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen protected void tearDown() throws Exception { 663ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen super.tearDown(); 673ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } 683ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 693ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen @LargeTest 703ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen public void testImageCapture() { 7156e1db465a1726f2dd0e0b4ad0624c14b797d313Yu Shan Emily Lau Log.v(TAG, "start testImageCapture test"); 723ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen Instrumentation inst = getInstrumentation(); 73d3ccb366eee12a802d94515974545e6414a61aa8Yu Shan Emily Lau inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN); 743ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen try { 753ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen for (int i = 0; i < TOTAL_NUMBER_OF_IMAGECAPTURE; i++) { 763ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 773ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); 783ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 7911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau //skip the first measurement 8011cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau if (i != 0) { 810a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang Camera c = getActivity(); 820a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang mTotalAutoFocusTime += c.mAutoFocusTime; 830a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang mTotalShutterLag += c.mShutterLag; 849324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li mTotalShutterToPictureDisplayedTime += 859324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li c.mShutterToPictureDisplayedTime; 869324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li mTotalPictureDisplayedToJpegCallbackTime += 879324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li c.mPictureDisplayedToJpegCallbackTime; 88e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li mTotalJpegCallbackFinishTime += c.mJpegCallbackFinishTime; 8911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau } 903ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } 913ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } catch (Exception e) { 922ff6c061fe55ad46b192961f27379853c20362bcWu-cheng Li Log.v(TAG, "Got exception", e); 933ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } 9411cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau //ToDO: yslau 9511cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau //1) Need to get the baseline from the cupcake so that we can add the 9611cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau //failure condition of the camera latency. 9711cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau //2) Only count those number with succesful capture. Set the timer to invalid 9811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau //before capture and ignore them if the value is invalid 9911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau int numberofRun = TOTAL_NUMBER_OF_IMAGECAPTURE - 1; 10011cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau mAvgAutoFocusTime = mTotalAutoFocusTime / numberofRun; 10111cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau mAvgShutterLag = mTotalShutterLag / numberofRun; 1029324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li mAvgShutterToPictureDisplayedTime = 1039324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li mTotalShutterToPictureDisplayedTime / numberofRun; 1049324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li mAvgPictureDisplayedToJpegCallbackTime = 1059324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li mTotalPictureDisplayedToJpegCallbackTime / numberofRun; 106e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li mAvgJpegCallbackFinishTime = 107e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li mTotalJpegCallbackFinishTime / numberofRun; 10811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau 1098160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau try { 1108160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau FileWriter fstream = null; 1118160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true); 1128160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau BufferedWriter out = new BufferedWriter(fstream); 1138160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau out.write("Camera Latency : \n"); 1148160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau out.write("Number of loop: " + TOTAL_NUMBER_OF_IMAGECAPTURE + "\n"); 1158160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau out.write("Avg AutoFocus = " + mAvgAutoFocusTime + "\n"); 1168160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau out.write("Avg mShutterLag = " + mAvgShutterLag + "\n"); 1179324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li out.write("Avg mShutterToPictureDisplayedTime = " 1189324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li + mAvgShutterToPictureDisplayedTime + "\n"); 1199324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li out.write("Avg mPictureDisplayedToJpegCallbackTime = " 1209324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li + mAvgPictureDisplayedToJpegCallbackTime + "\n"); 121e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li out.write("Avg mJpegCallbackFinishTime = " + 122e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li mAvgJpegCallbackFinishTime + "\n"); 1238160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau out.close(); 1248160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau fstream.close(); 1258160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau } catch (Exception e) { 1268160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau fail("Camera Latency write output to file"); 1278160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau } 128154d112a5ac848e986ed9c13f97b195f004bc151Yu Shan Emily Lau Log.v(TAG, "The Image capture wait time = " + 129154d112a5ac848e986ed9c13f97b195f004bc151Yu Shan Emily Lau WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); 13011cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau Log.v(TAG, "Avg AutoFocus = " + mAvgAutoFocusTime); 13111cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau Log.v(TAG, "Avg mShutterLag = " + mAvgShutterLag); 1329324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li Log.v(TAG, "Avg mShutterToPictureDisplayedTime = " 1339324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li + mAvgShutterToPictureDisplayedTime); 1349324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li Log.v(TAG, "Avg mPictureDisplayedToJpegCallbackTime = " 1359324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li + mAvgPictureDisplayedToJpegCallbackTime); 136e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li Log.v(TAG, "Avg mJpegCallbackFinishTime = " + mAvgJpegCallbackFinishTime); 1373ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen } 1383ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen} 1393ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen 140