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; 25f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lauimport java.io.Writer; 2679a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport java.util.concurrent.Semaphore; 2779a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport java.util.concurrent.TimeUnit; 28f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.Camera; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder; 3279a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport android.os.Handler; 3320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lauimport android.os.Looper; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder; 3848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaRecorderStressTestRunner; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Junit / Instrumentation test case for the media player api 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaRecorderStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String TAG = "MediaRecorderStressTest"; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MediaRecorder mRecorder; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Camera mCamera; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_CAMERA_STRESS_LOOPS = 100; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_RECORDER_STRESS_LOOPS = 100; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS = 50; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER = 200; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long WAIT_TIME_CAMERA_TEST = 3000; // 3 second 5655a6ac8c542ae831b0d041360cab4bbc7212ade5Yu Shan Emily Lau private static final long WAIT_TIME_RECORDER_TEST = 6000; // 6 second 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String OUTPUT_FILE = "/sdcard/temp"; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String OUTPUT_FILE_EXT = ".3gp"; 59f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau private static final String MEDIA_STRESS_OUTPUT = 60f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau "/sdcard/mediaStressOutput.txt"; 6120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback(); 6220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau private final RecorderErrorCallback mRecorderErrorCallback = new RecorderErrorCallback(); 6320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 6479a3981e3885b9144bb3d458682141eed7365939Jeff Brown private final static int WAIT_TIMEOUT = 10000; 6579a3981e3885b9144bb3d458682141eed7365939Jeff Brown private Thread mLooperThread; 6679a3981e3885b9144bb3d458682141eed7365939Jeff Brown private Handler mHandler; 6779a3981e3885b9144bb3d458682141eed7365939Jeff Brown 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MediaRecorderStressTest() { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("com.android.mediaframeworktest", MediaFrameworkTest.class); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setUp() throws Exception { 7379a3981e3885b9144bb3d458682141eed7365939Jeff Brown final Semaphore sem = new Semaphore(0); 7479a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread = new Thread() { 7579a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 7679a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 7779a3981e3885b9144bb3d458682141eed7365939Jeff Brown Log.v(TAG, "starting looper"); 7879a3981e3885b9144bb3d458682141eed7365939Jeff Brown Looper.prepare(); 7979a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler = new Handler(); 8079a3981e3885b9144bb3d458682141eed7365939Jeff Brown sem.release(); 8179a3981e3885b9144bb3d458682141eed7365939Jeff Brown Looper.loop(); 8279a3981e3885b9144bb3d458682141eed7365939Jeff Brown Log.v(TAG, "quit looper"); 8379a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 8479a3981e3885b9144bb3d458682141eed7365939Jeff Brown }; 8579a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread.start(); 8679a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (! sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 8779a3981e3885b9144bb3d458682141eed7365939Jeff Brown fail("Failed to start the looper."); 8879a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 8979a3981e3885b9144bb3d458682141eed7365939Jeff Brown 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getActivity(); 9179a3981e3885b9144bb3d458682141eed7365939Jeff Brown super.setUp(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 9479a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 9579a3981e3885b9144bb3d458682141eed7365939Jeff Brown protected void tearDown() throws Exception { 9679a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (mHandler != null) { 9779a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler.getLooper().quit(); 9879a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler = null; 9979a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 10079a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (mLooperThread != null) { 10179a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread.join(WAIT_TIMEOUT); 10279a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (mLooperThread.isAlive()) { 10379a3981e3885b9144bb3d458682141eed7365939Jeff Brown fail("Failed to stop the looper."); 10420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 10579a3981e3885b9144bb3d458682141eed7365939Jeff Brown mLooperThread = null; 10620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 10720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 10879a3981e3885b9144bb3d458682141eed7365939Jeff Brown super.tearDown(); 10920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 11020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 11179a3981e3885b9144bb3d458682141eed7365939Jeff Brown private void runOnLooper(final Runnable command) throws InterruptedException { 11279a3981e3885b9144bb3d458682141eed7365939Jeff Brown final Semaphore sem = new Semaphore(0); 11379a3981e3885b9144bb3d458682141eed7365939Jeff Brown mHandler.post(new Runnable() { 11420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau @Override 11520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau public void run() { 11679a3981e3885b9144bb3d458682141eed7365939Jeff Brown try { 11779a3981e3885b9144bb3d458682141eed7365939Jeff Brown command.run(); 11879a3981e3885b9144bb3d458682141eed7365939Jeff Brown } finally { 11979a3981e3885b9144bb3d458682141eed7365939Jeff Brown sem.release(); 12020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 12120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 12279a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 12379a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (! sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 12479a3981e3885b9144bb3d458682141eed7365939Jeff Brown fail("Failed to run the command on the looper."); 12579a3981e3885b9144bb3d458682141eed7365939Jeff Brown } 12620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 12720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 12879a3981e3885b9144bb3d458682141eed7365939Jeff Brown private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback { 12979a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void onError(int error, android.hardware.Camera camera) { 13079a3981e3885b9144bb3d458682141eed7365939Jeff Brown if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) { 13179a3981e3885b9144bb3d458682141eed7365939Jeff Brown assertTrue("Camera test mediaserver died", false); 13220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 13320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 13420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 13520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 13679a3981e3885b9144bb3d458682141eed7365939Jeff Brown private final class RecorderErrorCallback implements MediaRecorder.OnErrorListener { 13779a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void onError(MediaRecorder mr, int what, int extra) { 13879a3981e3885b9144bb3d458682141eed7365939Jeff Brown // fail the test case no matter what error come up 13979a3981e3885b9144bb3d458682141eed7365939Jeff Brown assertTrue("mediaRecorder error", false); 14020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 14120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 14220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Test case for stressing the camera preview. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressCamera() throws Exception { 14620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 148f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau File stressOutFile = new File(MEDIA_STRESS_OUTPUT); 149f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau Writer output = new BufferedWriter(new FileWriter(stressOutFile, true)); 150f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("Camera start preview stress:\n"); 15120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau output.write("Total number of loops:" + 152f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau NUMBER_OF_CAMERA_STRESS_LOOPS + "\n"); 15320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau try { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Start preview"); 155f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("No of loop: "); 15620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 15779a3981e3885b9144bb3d458682141eed7365939Jeff Brown for (int i = 0; i< NUMBER_OF_CAMERA_STRESS_LOOPS; i++) { 15879a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 15979a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 16079a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 16179a3981e3885b9144bb3d458682141eed7365939Jeff Brown mCamera = Camera.open(); 16220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 16379a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 16420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mCamera.setErrorCallback(mCameraErrorCallback); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.setPreviewDisplay(mSurfaceHolder); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.startPreview(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(WAIT_TIME_CAMERA_TEST); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.stopPreview(); 16979a3981e3885b9144bb3d458682141eed7365939Jeff Brown mCamera.release(); 170f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write(" ," + i); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 17320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau assertTrue("CameraStressTest", false); 17420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau Log.v(TAG, e.toString()); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 176f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("\n\n"); 177f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.close(); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Test case for stressing the camera preview. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressRecorder() throws Exception { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String filename; 18420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 186f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau File stressOutFile = new File(MEDIA_STRESS_OUTPUT); 187f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau Writer output = new BufferedWriter(new FileWriter(stressOutFile, true)); 188f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("H263 video record- reset after prepare Stress test\n"); 189f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("Total number of loops:" + 190f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau NUMBER_OF_RECORDER_STRESS_LOOPS + "\n"); 191f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau try { 192f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("No of loop: "); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Start preview"); 19479a3981e3885b9144bb3d458682141eed7365939Jeff Brown for (int i = 0; i < NUMBER_OF_RECORDER_STRESS_LOOPS; i++) { 19579a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 19679a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 19779a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 19879a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder = new MediaRecorder(); 19920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 20079a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "counter = " + i); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, filename); 20420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOnErrorListener(mRecorderErrorCallback); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 20620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(filename); 208d8f7c2c2dcc9548bc8808e648904c918ecd1d1baDevaraj Rangasamy mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(176,144); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setEncoder"); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setPreview"); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "prepare"); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "before release"); 21820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau Thread.sleep(WAIT_TIME_RECORDER_TEST); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.reset(); 22079a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder.release(); 221f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write(", " + i); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 22420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau assertTrue("Recorder Stress test", false); 22520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau Log.v(TAG, e.toString()); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 227f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("\n\n"); 228f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.close(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Stress test case for switching camera and video recorder preview. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressCameraSwitchRecorder() throws Exception { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String filename; 23520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 237f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau File stressOutFile = new File(MEDIA_STRESS_OUTPUT); 238f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau Writer output = new BufferedWriter(new FileWriter(stressOutFile, true)); 239f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("Camera and video recorder preview switching\n"); 240f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("Total number of loops:" 241f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau + NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER + "\n"); 24220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau try { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Start preview"); 244f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("No of loop: "); 24579a3981e3885b9144bb3d458682141eed7365939Jeff Brown for (int i = 0; i < NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER; i++) { 24679a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 24779a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 24879a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 24979a3981e3885b9144bb3d458682141eed7365939Jeff Brown mCamera = Camera.open(); 25020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 25179a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 25220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mCamera.setErrorCallback(mCameraErrorCallback); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.setPreviewDisplay(mSurfaceHolder); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.startPreview(); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(WAIT_TIME_CAMERA_TEST); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera.stopPreview(); 25779a3981e3885b9144bb3d458682141eed7365939Jeff Brown mCamera.release(); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera = null; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "release camera"); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, filename); 26279a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 26379a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 26479a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 26579a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder = new MediaRecorder(); 26620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 26779a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 26820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOnErrorListener(mRecorderErrorCallback); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 27020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(filename); 272d8f7c2c2dcc9548bc8808e648904c918ecd1d1baDevaraj Rangasamy mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(176,144); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Media recorder setEncoder"); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "mediaRecorder setPreview"); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "prepare"); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "before release"); 28120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau Thread.sleep(WAIT_TIME_CAMERA_TEST); 28279a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder.release(); 283f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau Log.v(TAG, "release video recorder"); 284f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write(", " + i); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 28720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau assertTrue("Camer and recorder switch mode", false); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, e.toString()); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 290f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("\n\n"); 291f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.close(); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau 29448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau public void validateRecordedVideo(String recorded_file) { 29548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau try { 29648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau MediaPlayer mp = new MediaPlayer(); 29748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mp.setDataSource(recorded_file); 29848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mp.prepare(); 29948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int duration = mp.getDuration(); 30048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau if (duration <= 0){ 30148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau assertTrue("stressRecordAndPlayback", false); 30248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 30393aa00c664ae59c2224853f14d30a6671c467ef0Yu Shan Emily Lau mp.release(); 30448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } catch (Exception e) { 30548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau assertTrue("stressRecordAndPlayback", false); 30648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 30748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 30848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 30948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau public void removeRecodedVideo(String filename){ 31048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau File video = new File(filename); 31148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "remove recorded video " + filename); 31248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau video.delete(); 31348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 31448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Stress test case for record a video and play right away. 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testStressRecordVideoAndPlayback() throws Exception { 31848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int iterations = MediaRecorderStressTestRunner.mIterations; 31948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int video_encoder = MediaRecorderStressTestRunner.mVideoEncoder; 32048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int audio_encoder = MediaRecorderStressTestRunner.mAudioEncdoer; 32148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int frame_rate = MediaRecorderStressTestRunner.mFrameRate; 32248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int video_width = MediaRecorderStressTestRunner.mVideoWidth; 32348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int video_height = MediaRecorderStressTestRunner.mVideoHeight; 32448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int bit_rate = MediaRecorderStressTestRunner.mBitRate; 32548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau boolean remove_video = MediaRecorderStressTestRunner.mRemoveVideo; 32648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau int record_duration = MediaRecorderStressTestRunner.mDuration; 32748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String filename; 32920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau SurfaceHolder mSurfaceHolder; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 331f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau File stressOutFile = new File(MEDIA_STRESS_OUTPUT); 33248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Writer output = new BufferedWriter( 33348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau new FileWriter(stressOutFile, true)); 334f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("Video record and play back stress test:\n"); 335f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("Total number of loops:" 336f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau + NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS + "\n"); 337f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau try { 338f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("No of loop: "); 33948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau for (int i = 0; i < iterations; i++){ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, filename); 34279a3981e3885b9144bb3d458682141eed7365939Jeff Brown runOnLooper(new Runnable() { 34379a3981e3885b9144bb3d458682141eed7365939Jeff Brown @Override 34479a3981e3885b9144bb3d458682141eed7365939Jeff Brown public void run() { 34579a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder = new MediaRecorder(); 34620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 34779a3981e3885b9144bb3d458682141eed7365939Jeff Brown }); 34848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "iterations : " + iterations); 34948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "video_encoder : " + video_encoder); 35048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "audio_encoder : " + audio_encoder); 35148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "frame_rate : " + frame_rate); 35248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "video_width : " + video_width); 35348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "video_height : " + video_height); 35448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "bit rate : " + bit_rate); 35548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, "record_duration : " + record_duration); 35648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau 35720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOnErrorListener(mRecorderErrorCallback); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 36020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(filename); 36248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mRecorder.setVideoFrameRate(frame_rate); 36348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mRecorder.setVideoSize(video_width, video_height); 36448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mRecorder.setVideoEncoder(video_encoder); 36548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mRecorder.setAudioEncoder(audio_encoder); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "mediaRecorder setPreview"); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 36920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau mRecorder.start(); 37048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Thread.sleep(record_duration); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "Before stop"); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.stop(); 37379a3981e3885b9144bb3d458682141eed7365939Jeff Brown mRecorder.release(); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //start the playback 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaPlayer mp = new MediaPlayer(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.setDataSource(filename); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder()); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.prepare(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.start(); 38048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Thread.sleep(record_duration); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.release(); 38248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau validateRecordedVideo(filename); 38348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau if (remove_video) { 38448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau removeRecodedVideo(filename); 38548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 386f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write(", " + i); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 38925d7094279d2eeda0b18a2ca0104d672c4b3c8e5James Dong Log.v(TAG, e.toString()); 39020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau assertTrue("record and playback", false); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 392f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.write("\n\n"); 393f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau output.close(); 39420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 396