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;
3479a3981e3885b9144bb3d458682141eed7365939Jeff Brownimport android.os.Handler;
3520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lauimport android.os.Looper;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder;
4048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaRecorderStressTestRunner;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Junit / Instrumentation test case for the media player api
4427c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi */
4527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchipublic class MediaRecorderStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
4627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi
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;
5027c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi
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;
5527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    private static final int NUMBER_OF_TIME_LAPSE_LOOPS = 25;
5627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    private static final int TIME_LAPSE_PLAYBACK_WAIT_TIME = 5* 1000; // 5 seconds
5727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    private static final long WAIT_TIME_CAMERA_TEST = 3 * 1000; // 3 seconds
5827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    private static final long WAIT_TIME_RECORDER_TEST = 6 * 1000; // 6 seconds
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String OUTPUT_FILE = "/sdcard/temp";
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String OUTPUT_FILE_EXT = ".3gp";
61f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau    private static final String MEDIA_STRESS_OUTPUT =
62f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        "/sdcard/mediaStressOutput.txt";
63e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau    private static final int CAMERA_ID = 0;
64e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau
6520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
6620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    private final RecorderErrorCallback mRecorderErrorCallback = new RecorderErrorCallback();
6720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
6827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    private final static int WAIT_TIMEOUT = 10 * 1000; // 10 seconds
6979a3981e3885b9144bb3d458682141eed7365939Jeff Brown    private Thread mLooperThread;
7079a3981e3885b9144bb3d458682141eed7365939Jeff Brown    private Handler mHandler;
7179a3981e3885b9144bb3d458682141eed7365939Jeff Brown
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaRecorderStressTest() {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
7779a3981e3885b9144bb3d458682141eed7365939Jeff Brown        final Semaphore sem = new Semaphore(0);
7879a3981e3885b9144bb3d458682141eed7365939Jeff Brown        mLooperThread = new Thread() {
7979a3981e3885b9144bb3d458682141eed7365939Jeff Brown            @Override
8079a3981e3885b9144bb3d458682141eed7365939Jeff Brown            public void run() {
8179a3981e3885b9144bb3d458682141eed7365939Jeff Brown                Log.v(TAG, "starting looper");
8279a3981e3885b9144bb3d458682141eed7365939Jeff Brown                Looper.prepare();
8379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                mHandler = new Handler();
8479a3981e3885b9144bb3d458682141eed7365939Jeff Brown                sem.release();
8579a3981e3885b9144bb3d458682141eed7365939Jeff Brown                Looper.loop();
8679a3981e3885b9144bb3d458682141eed7365939Jeff Brown                Log.v(TAG, "quit looper");
8779a3981e3885b9144bb3d458682141eed7365939Jeff Brown            }
8879a3981e3885b9144bb3d458682141eed7365939Jeff Brown        };
8979a3981e3885b9144bb3d458682141eed7365939Jeff Brown        mLooperThread.start();
9079a3981e3885b9144bb3d458682141eed7365939Jeff Brown        if (! sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
9179a3981e3885b9144bb3d458682141eed7365939Jeff Brown            fail("Failed to start the looper.");
9279a3981e3885b9144bb3d458682141eed7365939Jeff Brown        }
93003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau        //Insert a 2 second before launching the test activity. This is
94003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau        //the workaround for the race condition of requesting the updated surface.
95003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau        Thread.sleep(2000);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getActivity();
9779a3981e3885b9144bb3d458682141eed7365939Jeff Brown        super.setUp();
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
10079a3981e3885b9144bb3d458682141eed7365939Jeff Brown    @Override
10179a3981e3885b9144bb3d458682141eed7365939Jeff Brown    protected void tearDown() throws Exception {
10279a3981e3885b9144bb3d458682141eed7365939Jeff Brown        if (mHandler != null) {
10379a3981e3885b9144bb3d458682141eed7365939Jeff Brown            mHandler.getLooper().quit();
10479a3981e3885b9144bb3d458682141eed7365939Jeff Brown            mHandler = null;
10579a3981e3885b9144bb3d458682141eed7365939Jeff Brown        }
10679a3981e3885b9144bb3d458682141eed7365939Jeff Brown        if (mLooperThread != null) {
10779a3981e3885b9144bb3d458682141eed7365939Jeff Brown            mLooperThread.join(WAIT_TIMEOUT);
10879a3981e3885b9144bb3d458682141eed7365939Jeff Brown            if (mLooperThread.isAlive()) {
10979a3981e3885b9144bb3d458682141eed7365939Jeff Brown                fail("Failed to stop the looper.");
11020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            }
11179a3981e3885b9144bb3d458682141eed7365939Jeff Brown            mLooperThread = null;
11220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        }
11320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
11479a3981e3885b9144bb3d458682141eed7365939Jeff Brown        super.tearDown();
11520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    }
11620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
11779a3981e3885b9144bb3d458682141eed7365939Jeff Brown    private void runOnLooper(final Runnable command) throws InterruptedException {
11879a3981e3885b9144bb3d458682141eed7365939Jeff Brown        final Semaphore sem = new Semaphore(0);
11979a3981e3885b9144bb3d458682141eed7365939Jeff Brown        mHandler.post(new Runnable() {
12020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            @Override
12120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            public void run() {
12279a3981e3885b9144bb3d458682141eed7365939Jeff Brown                try {
12379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    command.run();
12479a3981e3885b9144bb3d458682141eed7365939Jeff Brown                } finally {
12579a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    sem.release();
12620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                }
12720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            }
12879a3981e3885b9144bb3d458682141eed7365939Jeff Brown        });
12979a3981e3885b9144bb3d458682141eed7365939Jeff Brown        if (! sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
13079a3981e3885b9144bb3d458682141eed7365939Jeff Brown            fail("Failed to run the command on the looper.");
13179a3981e3885b9144bb3d458682141eed7365939Jeff Brown        }
13220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    }
13320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
13479a3981e3885b9144bb3d458682141eed7365939Jeff Brown    private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
13579a3981e3885b9144bb3d458682141eed7365939Jeff Brown        public void onError(int error, android.hardware.Camera camera) {
13679a3981e3885b9144bb3d458682141eed7365939Jeff Brown            if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
13779a3981e3885b9144bb3d458682141eed7365939Jeff Brown                assertTrue("Camera test mediaserver died", false);
13820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            }
13920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        }
14020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    }
14120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
14279a3981e3885b9144bb3d458682141eed7365939Jeff Brown    private final class RecorderErrorCallback implements MediaRecorder.OnErrorListener {
14379a3981e3885b9144bb3d458682141eed7365939Jeff Brown        public void onError(MediaRecorder mr, int what, int extra) {
14479a3981e3885b9144bb3d458682141eed7365939Jeff Brown            // fail the test case no matter what error come up
14579a3981e3885b9144bb3d458682141eed7365939Jeff Brown            assertTrue("mediaRecorder error", false);
14620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        }
14720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    }
14820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //Test case for stressing the camera preview.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testStressCamera() throws Exception {
15220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        SurfaceHolder mSurfaceHolder;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
154f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
155f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
156f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("Camera start preview stress:\n");
15720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        output.write("Total number of loops:" +
158f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                NUMBER_OF_CAMERA_STRESS_LOOPS + "\n");
15920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        try {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Start preview");
161f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau            output.write("No of loop: ");
16220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
16379a3981e3885b9144bb3d458682141eed7365939Jeff Brown            for (int i = 0; i< NUMBER_OF_CAMERA_STRESS_LOOPS; i++) {
16479a3981e3885b9144bb3d458682141eed7365939Jeff Brown                runOnLooper(new Runnable() {
16579a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    @Override
16679a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    public void run() {
167e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau                        mCamera = Camera.open(CAMERA_ID);
16820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                    }
16979a3981e3885b9144bb3d458682141eed7365939Jeff Brown                });
17020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mCamera.setErrorCallback(mCameraErrorCallback);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera.setPreviewDisplay(mSurfaceHolder);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera.startPreview();
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(WAIT_TIME_CAMERA_TEST);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera.stopPreview();
17579a3981e3885b9144bb3d458682141eed7365939Jeff Brown                mCamera.release();
176f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                output.write(" ," + i);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
17920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            assertTrue("CameraStressTest", false);
18020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            Log.v(TAG, e.toString());
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
182f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("\n\n");
183f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.close();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //Test case for stressing the camera preview.
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testStressRecorder() throws Exception {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String filename;
19020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        SurfaceHolder mSurfaceHolder;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
192f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
193f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
194f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("H263 video record- reset after prepare Stress test\n");
195f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("Total number of loops:" +
196f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                NUMBER_OF_RECORDER_STRESS_LOOPS + "\n");
197f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        try {
198f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau            output.write("No of loop: ");
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Start preview");
20079a3981e3885b9144bb3d458682141eed7365939Jeff Brown            for (int i = 0; i < NUMBER_OF_RECORDER_STRESS_LOOPS; i++) {
20179a3981e3885b9144bb3d458682141eed7365939Jeff Brown                runOnLooper(new Runnable() {
20279a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    @Override
20379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    public void run() {
20479a3981e3885b9144bb3d458682141eed7365939Jeff Brown                        mRecorder = new MediaRecorder();
20520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                    }
20679a3981e3885b9144bb3d458682141eed7365939Jeff Brown                });
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "counter = " + i);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, filename);
21020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.setOnErrorListener(mRecorderErrorCallback);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
21220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFile(filename);
214d8f7c2c2dcc9548bc8808e648904c918ecd1d1baDevaraj Rangasamy                mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSize(176,144);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setEncoder");
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setPreview");
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "prepare");
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.prepare();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "before release");
22420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                Thread.sleep(WAIT_TIME_RECORDER_TEST);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.reset();
22679a3981e3885b9144bb3d458682141eed7365939Jeff Brown                mRecorder.release();
227f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                output.write(", " + i);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
23020a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            assertTrue("Recorder Stress test", false);
23120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            Log.v(TAG, e.toString());
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
233f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("\n\n");
234f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.close();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //Stress test case for switching camera and video recorder preview.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testStressCameraSwitchRecorder() throws Exception {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String filename;
24120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        SurfaceHolder mSurfaceHolder;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
243f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
244f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
245f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("Camera and video recorder preview switching\n");
246f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("Total number of loops:"
247f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                + NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER + "\n");
24820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        try {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Start preview");
250f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau            output.write("No of loop: ");
25179a3981e3885b9144bb3d458682141eed7365939Jeff Brown            for (int i = 0; i < NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER; i++) {
25279a3981e3885b9144bb3d458682141eed7365939Jeff Brown                runOnLooper(new Runnable() {
25379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    @Override
25479a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    public void run() {
255e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau                        mCamera = Camera.open(CAMERA_ID);
25620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                    }
25779a3981e3885b9144bb3d458682141eed7365939Jeff Brown                });
25820a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mCamera.setErrorCallback(mCameraErrorCallback);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera.setPreviewDisplay(mSurfaceHolder);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera.startPreview();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(WAIT_TIME_CAMERA_TEST);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera.stopPreview();
26379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                mCamera.release();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCamera = null;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "release camera");
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, filename);
26879a3981e3885b9144bb3d458682141eed7365939Jeff Brown                runOnLooper(new Runnable() {
26979a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    @Override
27079a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    public void run() {
27179a3981e3885b9144bb3d458682141eed7365939Jeff Brown                        mRecorder = new MediaRecorder();
27220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                    }
27379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                });
27420a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.setOnErrorListener(mRecorderErrorCallback);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
27620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFile(filename);
278d8f7c2c2dcc9548bc8808e648904c918ecd1d1baDevaraj Rangasamy                mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSize(176,144);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "Media recorder setEncoder");
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "mediaRecorder setPreview");
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "prepare");
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.prepare();
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "before release");
28720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                Thread.sleep(WAIT_TIME_CAMERA_TEST);
28879a3981e3885b9144bb3d458682141eed7365939Jeff Brown                mRecorder.release();
289f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                Log.v(TAG, "release video recorder");
290f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                output.write(", " + i);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
29320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            assertTrue("Camer and recorder switch mode", false);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, e.toString());
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
296f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("\n\n");
297f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.close();
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29920a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau
30048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau    public void validateRecordedVideo(String recorded_file) {
30148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        try {
30248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            MediaPlayer mp = new MediaPlayer();
30348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            mp.setDataSource(recorded_file);
30448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            mp.prepare();
30548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            int duration = mp.getDuration();
30648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            if (duration <= 0){
30748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                assertTrue("stressRecordAndPlayback", false);
30848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            }
30993aa00c664ae59c2224853f14d30a6671c467ef0Yu Shan Emily Lau            mp.release();
31048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        } catch (Exception e) {
31148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            assertTrue("stressRecordAndPlayback", false);
31248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        }
31348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau    }
31448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau
31527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    public void removeRecordedVideo(String filename){
31648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        File video = new File(filename);
31748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        Log.v(TAG, "remove recorded video " + filename);
31848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        video.delete();
31948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau    }
32048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //Stress test case for record a video and play right away.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testStressRecordVideoAndPlayback() throws Exception {
32448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int iterations = MediaRecorderStressTestRunner.mIterations;
32548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int video_encoder = MediaRecorderStressTestRunner.mVideoEncoder;
32648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int audio_encoder = MediaRecorderStressTestRunner.mAudioEncdoer;
32748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int frame_rate = MediaRecorderStressTestRunner.mFrameRate;
32848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int video_width = MediaRecorderStressTestRunner.mVideoWidth;
32948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int video_height = MediaRecorderStressTestRunner.mVideoHeight;
33048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int bit_rate = MediaRecorderStressTestRunner.mBitRate;
33148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        boolean remove_video = MediaRecorderStressTestRunner.mRemoveVideo;
33248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        int record_duration = MediaRecorderStressTestRunner.mDuration;
33348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String filename;
33520a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau        SurfaceHolder mSurfaceHolder;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
337f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
33848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        Writer output = new BufferedWriter(
33948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                new FileWriter(stressOutFile, true));
340f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("Video record and play back stress test:\n");
341f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("Total number of loops:"
342f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                + NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS + "\n");
343f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        try {
344f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau            output.write("No of loop: ");
34548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            for (int i = 0; i < iterations; i++){
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, filename);
34879a3981e3885b9144bb3d458682141eed7365939Jeff Brown                runOnLooper(new Runnable() {
34979a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    @Override
35079a3981e3885b9144bb3d458682141eed7365939Jeff Brown                    public void run() {
35179a3981e3885b9144bb3d458682141eed7365939Jeff Brown                        mRecorder = new MediaRecorder();
35220a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                    }
35379a3981e3885b9144bb3d458682141eed7365939Jeff Brown                });
35448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "iterations : " + iterations);
35548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "video_encoder : " + video_encoder);
35648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "audio_encoder : " + audio_encoder);
35748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "frame_rate : " + frame_rate);
35848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "video_width : " + video_width);
35948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "video_height : " + video_height);
36048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "bit rate : " + bit_rate);
36148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, "record_duration : " + record_duration);
36248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau
36320a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.setOnErrorListener(mRecorderErrorCallback);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
36620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFile(filename);
36848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mRecorder.setVideoFrameRate(frame_rate);
36948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mRecorder.setVideoSize(video_width, video_height);
37048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mRecorder.setVideoEncoder(video_encoder);
37148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mRecorder.setAudioEncoder(audio_encoder);
372eb4f3256b77fe7fd783297a550a64ea441c41169Yu Shan Emily Lau                mRecorder.setVideoEncodingBitRate(bit_rate);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "mediaRecorder setPreview");
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.prepare();
37620a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau                mRecorder.start();
37748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Thread.sleep(record_duration);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "Before stop");
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.stop();
38079a3981e3885b9144bb3d458682141eed7365939Jeff Brown                mRecorder.release();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //start the playback
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                MediaPlayer mp = new MediaPlayer();
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.setDataSource(filename);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.prepare();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.start();
38748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Thread.sleep(record_duration);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.release();
38948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                validateRecordedVideo(filename);
39048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                if (remove_video) {
39127c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi                    removeRecordedVideo(filename);
39248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                }
393f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau                output.write(", " + i);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
39625d7094279d2eeda0b18a2ca0104d672c4b3c8e5James Dong            Log.v(TAG, e.toString());
39720a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau            assertTrue("record and playback", false);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
399f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.write("\n\n");
400f16da13585ac22bb8d8fe7538509c2726bb06f29Yu Shan Emily Lau        output.close();
40120a6b955fe4ea5ba4025f16ba2da013df176c035Yu Shan Emily Lau    }
40227c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi
40327c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    // Test case for stressing time lapse
40427c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    @LargeTest
40527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    public void testStressTimeLapse() throws Exception {
40627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        SurfaceHolder mSurfaceHolder;
40727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
40827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        int record_duration = MediaRecorderStressTestRunner.mTimeLapseDuration;
40927c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        boolean remove_video = MediaRecorderStressTestRunner.mRemoveVideo;
41027c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        double captureRate = MediaRecorderStressTestRunner.mCaptureRate;
41127c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        String filename;
41227c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
41327c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
41427c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        output.write("Start camera time lapse stress:\n");
41527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        output.write("Total number of loops: " + NUMBER_OF_TIME_LAPSE_LOOPS + "\n");
41627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi
41727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        try {
4187b996d19afcc7030400b515a665d28523a44bb18James Dong            for (int j = 0, n = Camera.getNumberOfCameras(); j < n; j++) {
4197b996d19afcc7030400b515a665d28523a44bb18James Dong                output.write("No of loop: camera " + j);
4207b996d19afcc7030400b515a665d28523a44bb18James Dong                for (int i = 0; i < NUMBER_OF_TIME_LAPSE_LOOPS; i++) {
4217b996d19afcc7030400b515a665d28523a44bb18James Dong                    filename = OUTPUT_FILE + j + "_" + i + OUTPUT_FILE_EXT;
4227b996d19afcc7030400b515a665d28523a44bb18James Dong                    Log.v(TAG, filename);
4237b996d19afcc7030400b515a665d28523a44bb18James Dong                    runOnLooper(new Runnable() {
4247b996d19afcc7030400b515a665d28523a44bb18James Dong                        @Override
4257b996d19afcc7030400b515a665d28523a44bb18James Dong                        public void run() {
4267b996d19afcc7030400b515a665d28523a44bb18James Dong                            mRecorder = new MediaRecorder();
4277b996d19afcc7030400b515a665d28523a44bb18James Dong                        }
4287b996d19afcc7030400b515a665d28523a44bb18James Dong                    });
4297b996d19afcc7030400b515a665d28523a44bb18James Dong
4307b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Set callback
4317b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.setOnErrorListener(mRecorderErrorCallback);
4327b996d19afcc7030400b515a665d28523a44bb18James Dong
4337b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Set video source
4347b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
4357b996d19afcc7030400b515a665d28523a44bb18James Dong
4367b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Set camcorder profile for time lapse
4377b996d19afcc7030400b515a665d28523a44bb18James Dong                    CamcorderProfile profile =
4387b996d19afcc7030400b515a665d28523a44bb18James Dong                        CamcorderProfile.get(j, CamcorderProfile.QUALITY_TIME_LAPSE_HIGH);
4397b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.setProfile(profile);
4407b996d19afcc7030400b515a665d28523a44bb18James Dong
4417b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Set the timelapse setting; 0.1 = 10 sec timelapse, 0.5 = 2 sec timelapse, etc.
4427b996d19afcc7030400b515a665d28523a44bb18James Dong                    // http://developer.android.com/guide/topics/media/camera.html#time-lapse-video
4437b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.setCaptureRate(captureRate);
4447b996d19afcc7030400b515a665d28523a44bb18James Dong
4457b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Set output file
4467b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.setOutputFile(filename);
4477b996d19afcc7030400b515a665d28523a44bb18James Dong
4487b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Set the preview display
4497b996d19afcc7030400b515a665d28523a44bb18James Dong                    Log.v(TAG, "mediaRecorder setPreviewDisplay");
4507b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
4517b996d19afcc7030400b515a665d28523a44bb18James Dong
4527b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.prepare();
4537b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.start();
4547b996d19afcc7030400b515a665d28523a44bb18James Dong                    Thread.sleep(record_duration);
4557b996d19afcc7030400b515a665d28523a44bb18James Dong                    Log.v(TAG, "Before stop");
4567b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.stop();
4577b996d19afcc7030400b515a665d28523a44bb18James Dong                    mRecorder.release();
4587b996d19afcc7030400b515a665d28523a44bb18James Dong
4597b996d19afcc7030400b515a665d28523a44bb18James Dong                    // Start the playback
4607b996d19afcc7030400b515a665d28523a44bb18James Dong                    MediaPlayer mp = new MediaPlayer();
4617b996d19afcc7030400b515a665d28523a44bb18James Dong                    mp.setDataSource(filename);
4627b996d19afcc7030400b515a665d28523a44bb18James Dong                    mp.setDisplay(mSurfaceHolder);
4637b996d19afcc7030400b515a665d28523a44bb18James Dong                    mp.prepare();
4647b996d19afcc7030400b515a665d28523a44bb18James Dong                    mp.start();
4657b996d19afcc7030400b515a665d28523a44bb18James Dong                    Thread.sleep(TIME_LAPSE_PLAYBACK_WAIT_TIME);
4667b996d19afcc7030400b515a665d28523a44bb18James Dong                    mp.release();
4677b996d19afcc7030400b515a665d28523a44bb18James Dong                    validateRecordedVideo(filename);
4687b996d19afcc7030400b515a665d28523a44bb18James Dong                    if (remove_video) {
4697b996d19afcc7030400b515a665d28523a44bb18James Dong                        removeRecordedVideo(filename);
47027c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi                    }
4717b996d19afcc7030400b515a665d28523a44bb18James Dong                    output.write(", " + i);
47227c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi                }
47327c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            }
47427c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        }
47527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        catch (IllegalStateException e) {
47627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            assertTrue("Camera time lapse stress test IllegalStateException", false);
47727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            Log.v(TAG, e.toString());
47827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        }
47927c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        catch (IOException e) {
48027c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            assertTrue("Camera time lapse stress test IOException", false);
48127c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            Log.v(TAG, e.toString());
48227c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        }
48327c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        catch (Exception e) {
48427c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            assertTrue("Camera time lapse stress test Exception", false);
48527c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi            Log.v(TAG, e.toString());
48627c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        }
48727c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        output.write("\n\n");
48827c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi        output.close();
48927c8d9ba169aa85127fac65d6df25e4335ee2fcaJason Noguchi    }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
491