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