19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.mediaframeworktest.stress; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaFrameworkTest; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lauimport java.io.BufferedWriter; 23f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lauimport java.io.File; 24f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lauimport java.io.FileWriter; 2527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchiimport java.io.IOException; 26f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lauimport java.io.Writer; 2779a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport java.util.concurrent.Semaphore; 2879a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport java.util.concurrent.TimeUnit; 29f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.Camera; 3127c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchiimport android.media.CamcorderProfile; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder; 34ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchiimport android.os.Environment; 3579a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport android.os.Handler; 3620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lauimport android.os.Looper; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder; 4148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaRecorderStressTestRunner; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Junit / Instrumentation test case for the media player api 4527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi */ 4627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchipublic class MediaRecorderStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 4727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String TAG = "MediaRecorderStressTest"; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MediaRecorder mRecorder; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Camera mCamera; 5127c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi 52ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private static final int CAMERA_ID = 0; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_CAMERA_STRESS_LOOPS = 100; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_RECORDER_STRESS_LOOPS = 100; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS = 50; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER = 200; 5727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi private static final int NUMBER_OF_TIME_LAPSE_LOOPS = 25; 5827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi private static final int TIME_LAPSE_PLAYBACK_WAIT_TIME = 5* 1000; // 5 seconds 59ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private static final int USE_TEST_RUNNER_PROFILE = -1; 60ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds 6127c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi private static final long WAIT_TIME_CAMERA_TEST = 3 * 1000; // 3 seconds 6227c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi private static final long WAIT_TIME_RECORDER_TEST = 6 * 1000; // 6 seconds 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String OUTPUT_FILE_EXT = ".3gp"; 64ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private static final String MEDIA_STRESS_OUTPUT = "mediaStressOutput.txt"; 65e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau 6620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback(); 6720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau private final RecorderErrorCallback mRecorderErrorCallback = new RecorderErrorCallback(); 6820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 6979a3981e3885b9144bb3d458682141eed7365939Jeff Brown private Handler mHandler; 70ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private Thread mLooperThread; 71ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private Writer mOutput; 7279a3981e3885b9144bb3d458682141eed7365939Jeff Brown 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MediaRecorderStressTest() { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("com.android.mediaframeworktest", MediaFrameworkTest.class); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setUp() throws Exception { 7879a3981e3885b9144bb3d458682141eed7365939Jeff Brown final Semaphore sem = new Semaphore(0); 7979a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread = new Thread() { 8079a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 8179a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 8279a3981e3885b9144bb3d458682141eed7365939Jeff Brown Log.v(TAG, "starting looper"); 8379a3981e3885b9144bb3d458682141eed7365939Jeff Brown Looper.prepare(); 8479a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler = new Handler(); 8579a3981e3885b9144bb3d458682141eed7365939Jeff Brown sem.release(); 8679a3981e3885b9144bb3d458682141eed7365939Jeff Brown Looper.loop(); 8779a3981e3885b9144bb3d458682141eed7365939Jeff Brown Log.v(TAG, "quit looper"); 8879a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 8979a3981e3885b9144bb3d458682141eed7365939Jeff Brown }; 9079a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread.start(); 9179a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (! sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 9279a3981e3885b9144bb3d458682141eed7365939Jeff Brown fail("Failed to start the looper."); 9379a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 94003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau //Insert a 2 second before launching the test activity. This is 95003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau //the workaround for the race condition of requesting the updated surface. 96003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau Thread.sleep(2000); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getActivity(); 9879a3981e3885b9144bb3d458682141eed7365939Jeff Brown super.setUp(); 99ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 100ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi File stressOutFile = new File(String.format("%s/%s", 101ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Environment.getExternalStorageDirectory(), MEDIA_STRESS_OUTPUT)); 102ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput = new BufferedWriter(new FileWriter(stressOutFile, true)); 103ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(this.getName() + "\n"); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 10679a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 10779a3981e3885b9144bb3d458682141eed7365939Jeff Brown protected void tearDown() throws Exception { 10879a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (mHandler != null) { 10979a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler.getLooper().quit(); 11079a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler = null; 11179a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 11279a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (mLooperThread != null) { 11379a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread.join(WAIT_TIMEOUT); 11479a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (mLooperThread.isAlive()) { 11579a3981e3885b9144bb3d458682141eed7365939Jeff Brown fail("Failed to stop the looper."); 11620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 11779a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread = null; 11820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 119ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("\n\n"); 120ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.close(); 12179a3981e3885b9144bb3d458682141eed7365939Jeff Brown super.tearDown(); 12220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 12320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 12479a3981e3885b9144bb3d458682141eed7365939Jeff Brown private void runOnLooper(final Runnable command) throws InterruptedException { 12579a3981e3885b9144bb3d458682141eed7365939Jeff Brown final Semaphore sem = new Semaphore(0); 12679a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler.post(new Runnable() { 12720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau @Override 12820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau public void run() { 12979a3981e3885b9144bb3d458682141eed7365939Jeff Brown try { 13079a3981e3885b9144bb3d458682141eed7365939Jeff Brown command.run(); 13179a3981e3885b9144bb3d458682141eed7365939Jeff Brown } finally { 13279a3981e3885b9144bb3d458682141eed7365939Jeff Brown sem.release(); 13320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 13420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 13579a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 13679a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (! sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 13779a3981e3885b9144bb3d458682141eed7365939Jeff Brown fail("Failed to run the command on the looper."); 13879a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 13920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 14020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 14179a3981e3885b9144bb3d458682141eed7365939Jeff Brown private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback { 14279a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void onError(int error, android.hardware.Camera camera) { 143ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail(String.format("Camera error, code: %d", error)); 14420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 14520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 14620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 14779a3981e3885b9144bb3d458682141eed7365939Jeff Brown private final class RecorderErrorCallback implements MediaRecorder.OnErrorListener { 14879a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void onError(MediaRecorder mr, int what, int extra) { 149ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail(String.format("Media recorder error, code: %d\textra: %d", what, extra)); 15020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 15120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 15220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Test case for stressing the camera preview. 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressCamera() throws Exception { 15620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 158ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "Camera start preview stress test"); 159ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("Total number of loops:" + NUMBER_OF_CAMERA_STRESS_LOOPS + "\n"); 16020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau try { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Start preview"); 162ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("No of loop: "); 16320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 16479a3981e3885b9144bb3d458682141eed7365939Jeff Brown for (int i = 0; i< NUMBER_OF_CAMERA_STRESS_LOOPS; i++) { 16579a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 16679a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 16779a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 168e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau mCamera = Camera.open(CAMERA_ID); 16920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 17079a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 17120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mCamera.setErrorCallback(mCameraErrorCallback); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.setPreviewDisplay(mSurfaceHolder); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.startPreview(); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(WAIT_TIME_CAMERA_TEST); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.stopPreview(); 17679a3981e3885b9144bb3d458682141eed7365939Jeff Brown mCamera.release(); 177ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (i == 0) { 178ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(i + 1); 179ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } else { 180ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(String.format(", %d", (i + 1))); 181ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 184ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 185ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("Camera startup preview stress test"); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Test case for stressing the camera preview. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressRecorder() throws Exception { 19220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 194ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "H263 video record: reset after prepare Stress test"); 195ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("Total number of loops:" + NUMBER_OF_RECORDER_STRESS_LOOPS + "\n"); 196f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau try { 197ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("No of loop: "); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Start preview"); 19979a3981e3885b9144bb3d458682141eed7365939Jeff Brown for (int i = 0; i < NUMBER_OF_RECORDER_STRESS_LOOPS; i++) { 20079a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 20179a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 20279a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 20379a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder = new MediaRecorder(); 20420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 20579a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "counter = " + i); 207ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi String fileName = String.format("%s/temp%d%s", 208ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Environment.getExternalStorageDirectory(), 209ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi i, OUTPUT_FILE_EXT); 210ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 211ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, fileName); 21220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOnErrorListener(mRecorderErrorCallback); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 21420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 215ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setOutputFile(fileName); 216d8f7c2c2dcc9548bc8808e648904c918ecd1d1baDevaraj Rangasamy mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(176,144); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setEncoder"); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setPreview"); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "prepare"); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "before release"); 22620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau Thread.sleep(WAIT_TIME_RECORDER_TEST); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.reset(); 22879a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder.release(); 229ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (i == 0) { 230ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(i + 1); 231ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } else { 232ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(String.format(", %d", (i + 1))); 233ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 236ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 237ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("H263 video recording stress test"); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Stress test case for switching camera and video recorder preview. 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressCameraSwitchRecorder() throws Exception { 24420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 246ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "Camera and video recorder preview switching"); 247ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("Total number of loops: " + 248ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER + "\n"); 24920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau try { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Start preview"); 251ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("No of loop: "); 25279a3981e3885b9144bb3d458682141eed7365939Jeff Brown for (int i = 0; i < NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER; i++) { 25379a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 25479a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 25579a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 256e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau mCamera = Camera.open(CAMERA_ID); 25720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 25879a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 25920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mCamera.setErrorCallback(mCameraErrorCallback); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.setPreviewDisplay(mSurfaceHolder); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.startPreview(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(WAIT_TIME_CAMERA_TEST); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.stopPreview(); 26479a3981e3885b9144bb3d458682141eed7365939Jeff Brown mCamera.release(); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera = null; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "release camera"); 267ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi String fileName = String.format("%s/temp%d%s", 268ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Environment.getExternalStorageDirectory(), 269ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi i, OUTPUT_FILE_EXT); 270ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, fileName); 27179a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 27279a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 27379a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 27479a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder = new MediaRecorder(); 27520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 27679a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 27720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOnErrorListener(mRecorderErrorCallback); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 27920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 280ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setOutputFile(fileName); 281d8f7c2c2dcc9548bc8808e648904c918ecd1d1baDevaraj Rangasamy mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(176,144); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Media recorder setEncoder"); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "mediaRecorder setPreview"); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "prepare"); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "before release"); 29020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau Thread.sleep(WAIT_TIME_CAMERA_TEST); 29179a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder.release(); 292f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau Log.v(TAG, "release video recorder"); 293ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (i == 0) { 294ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(i + 1); 295ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } else { 296ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(String.format(", %d", (i + 1))); 297ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 300ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 301ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("Camera and recorder switch mode"); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 305ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi public void validateRecordedVideo(String recordedFile) { 30648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau try { 30748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau MediaPlayer mp = new MediaPlayer(); 308ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mp.setDataSource(recordedFile); 30948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mp.prepare(); 31048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int duration = mp.getDuration(); 31148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau if (duration <= 0){ 312ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("stressRecordAndPlayback"); 31348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 31493aa00c664ae59c2224853f14d30a6671c467ef0Yu Shan Emily Lau mp.release(); 31548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } catch (Exception e) { 316ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("stressRecordAndPlayback"); 31748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 31848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 31948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 320ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi public void removeRecordedVideo(String fileName){ 321ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi File video = new File(fileName); 322ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "remove recorded video " + fileName); 32348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau video.delete(); 32448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 32548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 326ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // Helper method for record & playback testing with different camcorder profiles 327ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi private void recordVideoAndPlayback(int profile) throws Exception { 328ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int iterations; 329ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int recordDuration; 330ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi boolean removeVideo; 331ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 332ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int videoEncoder; 333ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int audioEncoder; 334ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int frameRate; 335ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int videoWidth; 336ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int videoHeight; 337ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int bitRate; 338ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 339ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (profile != USE_TEST_RUNNER_PROFILE) { 340ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi assertTrue(String.format("Camera doesn't support profile %d", profile), 341ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi CamcorderProfile.hasProfile(CAMERA_ID, profile)); 342ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi CamcorderProfile camcorderProfile = CamcorderProfile.get(CAMERA_ID, profile); 343ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi videoEncoder = camcorderProfile.videoCodec; 344ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi audioEncoder = camcorderProfile.audioCodec; 345ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi frameRate = camcorderProfile.videoFrameRate; 346ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi videoWidth = camcorderProfile.videoFrameWidth; 347ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi videoHeight = camcorderProfile.videoFrameHeight; 348ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi bitRate = camcorderProfile.videoBitRate; 349ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } else { 350ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi videoEncoder = MediaRecorderStressTestRunner.mVideoEncoder; 351ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi audioEncoder = MediaRecorderStressTestRunner.mAudioEncoder; 352ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi frameRate = MediaRecorderStressTestRunner.mFrameRate; 353ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi videoWidth = MediaRecorderStressTestRunner.mVideoWidth; 354ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi videoHeight = MediaRecorderStressTestRunner.mVideoHeight; 355ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi bitRate = MediaRecorderStressTestRunner.mBitRate; 356ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 357ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi iterations = MediaRecorderStressTestRunner.mIterations; 358ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi recordDuration = MediaRecorderStressTestRunner.mDuration; 359ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi removeVideo = MediaRecorderStressTestRunner.mRemoveVideo; 360ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 361ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 362ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("Total number of loops: " + iterations + "\n"); 363ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 364f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau try { 365ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("No of loop: "); 366ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi for (int i = 0; i < iterations; i++) { 367ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi String fileName = String.format("%s/temp%d%s", 368ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Environment.getExternalStorageDirectory(), i, OUTPUT_FILE_EXT); 369ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, fileName); 370ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 37179a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 37279a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 37379a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 37479a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder = new MediaRecorder(); 37520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 37679a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 377ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 37848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "iterations : " + iterations); 379ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "video encoder : " + videoEncoder); 380ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "audio encoder : " + audioEncoder); 381ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "frame rate : " + frameRate); 382ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "video width : " + videoWidth); 383ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "video height : " + videoHeight); 384ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "bit rate : " + bitRate); 385ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "record duration : " + recordDuration); 38648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 38720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOnErrorListener(mRecorderErrorCallback); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 39020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 391ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setOutputFile(fileName); 392ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setVideoFrameRate(frameRate); 393ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setVideoSize(videoWidth, videoHeight); 394ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setVideoEncoder(videoEncoder); 395ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setAudioEncoder(audioEncoder); 396ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setVideoEncodingBitRate(bitRate); 397ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "mediaRecorder setPreview"); 399ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 40120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.start(); 402ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Thread.sleep(recordDuration); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Before stop"); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.stop(); 40579a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder.release(); 406ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //start the playback 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaPlayer mp = new MediaPlayer(); 409ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mp.setDataSource(fileName); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder()); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.prepare(); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.start(); 413ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Thread.sleep(recordDuration); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.release(); 415ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi validateRecordedVideo(fileName); 416ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (removeVideo) { 417ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi removeRecordedVideo(fileName); 418ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 419ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (i == 0) { 420ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(i + 1); 421ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } else { 422ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(String.format(", %d", (i + 1))); 42348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 426ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 427ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("Record and playback"); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 430ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 431ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // Record and playback stress test @ 1080P quality 432ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi @LargeTest 433ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi public void testStressRecordVideoAndPlayback1080P() throws Exception { 434ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi recordVideoAndPlayback(CamcorderProfile.QUALITY_1080P); 435ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 436ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 437ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // Record and playback stress test @ 720P quality 438ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi @LargeTest 439ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi public void testStressRecordVideoAndPlayback720P() throws Exception { 440ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi recordVideoAndPlayback(CamcorderProfile.QUALITY_720P); 441ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 442ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 443ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // Record and playback stress test @ 480P quality 444ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi @LargeTest 445ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi public void testStressRecordVideoAndPlayback480P() throws Exception { 446ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi recordVideoAndPlayback(CamcorderProfile.QUALITY_480P); 447ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 448ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 449ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // This test method uses the codec info from the test runner. Use this 450ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // for more granular control of video encoding. 451ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi @LargeTest 452ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi public void defaultStressRecordVideoAndPlayback() throws Exception { 453ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi recordVideoAndPlayback(USE_TEST_RUNNER_PROFILE); 45420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 45527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi 45627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi // Test case for stressing time lapse 45727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi @LargeTest 45827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi public void testStressTimeLapse() throws Exception { 45927c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi SurfaceHolder mSurfaceHolder; 46027c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 461ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi int recordDuration = MediaRecorderStressTestRunner.mTimeLapseDuration; 462ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi boolean removeVideo = MediaRecorderStressTestRunner.mRemoveVideo; 46327c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi double captureRate = MediaRecorderStressTestRunner.mCaptureRate; 464ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, "Start camera time lapse stress:"); 465ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("Total number of loops: " + NUMBER_OF_TIME_LAPSE_LOOPS + "\n"); 46627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi 46727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi try { 468ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi for (int i = 0, n = Camera.getNumberOfCameras(); i < n; i++) { 469ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write("No of loop: camera " + i); 470ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi for (int j = 0; j < NUMBER_OF_TIME_LAPSE_LOOPS; j++) { 471ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi String fileName = String.format("%s/temp%d_%d%s", 472ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Environment.getExternalStorageDirectory(), i, j, OUTPUT_FILE_EXT); 473ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.v(TAG, fileName); 4747b996d19afcc7030400b515a665d28523a44bb18James Dong runOnLooper(new Runnable() { 4757b996d19afcc7030400b515a665d28523a44bb18James Dong @Override 4767b996d19afcc7030400b515a665d28523a44bb18James Dong public void run() { 4777b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder = new MediaRecorder(); 4787b996d19afcc7030400b515a665d28523a44bb18James Dong } 4797b996d19afcc7030400b515a665d28523a44bb18James Dong }); 4807b996d19afcc7030400b515a665d28523a44bb18James Dong 4817b996d19afcc7030400b515a665d28523a44bb18James Dong // Set callback 4827b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.setOnErrorListener(mRecorderErrorCallback); 4837b996d19afcc7030400b515a665d28523a44bb18James Dong 4847b996d19afcc7030400b515a665d28523a44bb18James Dong // Set video source 4857b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 4867b996d19afcc7030400b515a665d28523a44bb18James Dong 4877b996d19afcc7030400b515a665d28523a44bb18James Dong // Set camcorder profile for time lapse 4887b996d19afcc7030400b515a665d28523a44bb18James Dong CamcorderProfile profile = 4897b996d19afcc7030400b515a665d28523a44bb18James Dong CamcorderProfile.get(j, CamcorderProfile.QUALITY_TIME_LAPSE_HIGH); 4907b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.setProfile(profile); 4917b996d19afcc7030400b515a665d28523a44bb18James Dong 492ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi // Set the timelapse setting; 0.1 = 10 sec timelapse, 0.5 = 2 sec timelapse, etc 4937b996d19afcc7030400b515a665d28523a44bb18James Dong // http://developer.android.com/guide/topics/media/camera.html#time-lapse-video 4947b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.setCaptureRate(captureRate); 4957b996d19afcc7030400b515a665d28523a44bb18James Dong 4967b996d19afcc7030400b515a665d28523a44bb18James Dong // Set output file 497ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mRecorder.setOutputFile(fileName); 4987b996d19afcc7030400b515a665d28523a44bb18James Dong 4997b996d19afcc7030400b515a665d28523a44bb18James Dong // Set the preview display 5007b996d19afcc7030400b515a665d28523a44bb18James Dong Log.v(TAG, "mediaRecorder setPreviewDisplay"); 5017b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 5027b996d19afcc7030400b515a665d28523a44bb18James Dong 5037b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.prepare(); 5047b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.start(); 505ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Thread.sleep(recordDuration); 5067b996d19afcc7030400b515a665d28523a44bb18James Dong Log.v(TAG, "Before stop"); 5077b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.stop(); 5087b996d19afcc7030400b515a665d28523a44bb18James Dong mRecorder.release(); 5097b996d19afcc7030400b515a665d28523a44bb18James Dong 5107b996d19afcc7030400b515a665d28523a44bb18James Dong // Start the playback 5117b996d19afcc7030400b515a665d28523a44bb18James Dong MediaPlayer mp = new MediaPlayer(); 512ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mp.setDataSource(fileName); 5137b996d19afcc7030400b515a665d28523a44bb18James Dong mp.setDisplay(mSurfaceHolder); 5147b996d19afcc7030400b515a665d28523a44bb18James Dong mp.prepare(); 5157b996d19afcc7030400b515a665d28523a44bb18James Dong mp.start(); 5167b996d19afcc7030400b515a665d28523a44bb18James Dong Thread.sleep(TIME_LAPSE_PLAYBACK_WAIT_TIME); 5177b996d19afcc7030400b515a665d28523a44bb18James Dong mp.release(); 518ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi validateRecordedVideo(fileName); 519ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (removeVideo) { 520ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi removeRecordedVideo(fileName); 521ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } 522ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi 523ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi if (j == 0) { 524ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(j + 1); 525ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } else { 526ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi mOutput.write(String.format(", %d", (j + 1))); 52727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi } 52827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi } 52927c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi } 530ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } catch (IllegalStateException e) { 531ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 532ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("Camera time lapse stress test IllegalStateException"); 533ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } catch (IOException e) { 534ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 535ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("Camera time lapse stress test IOException"); 536ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi } catch (Exception e) { 537ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi Log.e(TAG, e.toString()); 538ca6a5eee8f72742298d28d8a4b8e1bd32020a237Jason Noguchi fail("Camera time lapse stress test Exception"); 53927c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi } 54027c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 542