1f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau/*
2f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * Copyright (C) 2009 The Android Open Source Project
3f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau *
4f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * Licensed under the Apache License, Version 2.0 (the "License");
5f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * you may not use this file except in compliance with the License.
6f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * You may obtain a copy of the License at
7f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau *
8f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau *      http://www.apache.org/licenses/LICENSE-2.0
9f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau *
10f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * Unless required by applicable law or agreed to in writing, software
11f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * distributed under the License is distributed on an "AS IS" BASIS,
12f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * See the License for the specific language governing permissions and
14f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * limitations under the License.
15f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau */
16f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
17f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Laupackage com.android.mediaframeworktest.stress;
18f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
19f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport com.android.mediaframeworktest.MediaFrameworkTest;
20f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
21f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.hardware.Camera;
22f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.media.MediaPlayer;
23f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.media.MediaRecorder;
24f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2;
25f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.test.suitebuilder.annotation.LargeTest;
26f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.util.Log;
27f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport android.view.SurfaceHolder;
28f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
29f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport com.android.mediaframeworktest.MediaNames;
30f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
31f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lauimport java.util.Random;
32f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
33f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau/**
34f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau * Junit / Instrumentation test case for the media player
35f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau */
36f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Laupublic class MediaPlayerStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
37f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    private String TAG = "MediaPlayerStressTest";
38f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    private MediaRecorder mRecorder;
39f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    private Camera mCamera;
40f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
41f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    private static final int NUMBER_OF_RANDOM_REPOSITION_AND_PLAY = 10;
42f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    private static final int NUMBER_OF_RANDOM_REPOSITION_AND_PLAY_SHORT = 5;
4355a6ac8c542ae831b0d041360cab4bbc7212ade5Yu Shan Emily Lau    private static final int NUMBER_OF_STRESS_LOOPS = 500;
44999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau    private static final int PLAYBACK_END_TOLERANCE = 30000;
45f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    private static final int WAIT_UNTIL_PLAYBACK_FINISH = 515000 ;
46f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
47f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    public MediaPlayerStressTest() {
48f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
49f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    }
50f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
51f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    protected void setUp() throws Exception {
52f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        getActivity();
53f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        super.setUp();
54f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    }
55f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
56f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    @LargeTest
57f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    public void testStressHWDecoderRelease() throws Exception {
58f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        SurfaceHolder mSurfaceHolder;
59f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        long randomseed = System.currentTimeMillis();
60f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        Random generator = new Random(randomseed);
61f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        Log.v(TAG, "Random seed: " + randomseed);
62f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        int video_duration = MediaNames.STREAM_H264_480_360_1411k_DURATION;
63f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        int random_play_time;
64f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
65f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
66f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        try {
67c060d86f7dcc2759b94867e5c0c1105b31af5309Gloria Wang            assertTrue(MediaFrameworkTest.checkStreamingServer());
68f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau            for (int i = 0; i < NUMBER_OF_STRESS_LOOPS; i++) {
69f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                MediaPlayer mp = new MediaPlayer();
70f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.setDataSource(MediaNames.STREAM_H264_480_360_1411k);
71f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
72f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.prepare();
73f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.start();
74f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                // seek and play
75f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                for (int j = 0; j < generator.nextInt(10); j++) {
76f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    random_play_time =
77f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                        generator.nextInt(MediaNames.STREAM_H264_480_360_1411k_DURATION / 2);
78f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    Log.v(TAG, "Play time = " + random_play_time);
79f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    Thread.sleep(random_play_time);
80f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    int seek_time = MediaNames.STREAM_H264_480_360_1411k_DURATION / 2;
81f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    Log.v(TAG, "Seek time = " + seek_time);
82f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    mp.seekTo(seek_time);
83f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                }
84f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.release();
85f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau            }
86f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
87f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        } catch (Exception e) {
88f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau            Log.v(TAG, e.toString());
89b1ce51fb73b6d7ad5773e06ec32dedc6e4d42f4aYu Shan Emily Lau            assertTrue("testStressHWDecoderRelease", false);
90f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        }
91f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    }
92f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
93f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    @LargeTest
94f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    public void testStressGetCurrentPosition() throws Exception {
95f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        SurfaceHolder mSurfaceHolder;
96f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        long randomseed = System.currentTimeMillis();
97f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        Random generator = new Random(randomseed);
98f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        Log.v(TAG, "Random seed: " + randomseed);
9913b93713f36d64783f3199c83b37ca58d8ff35bdYu Shan Emily Lau        int video_duration = MediaNames.VIDEO_H263_AMR_DURATION;
100f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        int random_play_time = 0;
101f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        int random_seek_time = 0;
102147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau        int random_no_of_seek = 0;
103f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
104f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
105f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        try {
106f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau            for (int i = 0; i < NUMBER_OF_STRESS_LOOPS; i++) {
107f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                MediaPlayer mp = new MediaPlayer();
108f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.setDataSource(MediaNames.VIDEO_H263_AMR);
109f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
110f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.prepare();
111f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.start();
112147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau                random_no_of_seek = generator.nextInt(10);
113147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau                // make sure the seek at least run once.
114147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau                if (random_no_of_seek == 0) {
115147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau                    random_no_of_seek = 1;
116147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau                }
117999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                Log.v(TAG, "random_seek = " + random_no_of_seek);
118999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                // Play for 10 seconds then random seekTo
119147a0c270b5a6078218496b17df9eab70b358b67Yu Shan Emily Lau                for (int j = 0; j < random_no_of_seek; j++) {
120f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    random_play_time =
121999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                        generator.nextInt(video_duration / 100);
122f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    Log.v(TAG, "Play time = " + random_play_time);
123f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    Thread.sleep(random_play_time);
124f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    random_seek_time =
125f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                        generator.nextInt(video_duration / 2);
126f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    Log.v(TAG, "Seek time = " + random_seek_time);
127f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    mp.seekTo(random_seek_time);
128f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                }
129999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                //Seek to 10s from the end of the video
130999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                mp.seekTo(video_duration - 10000);
131999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                //After reposition, play 30 seconds the video should be finished.
132999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                Thread.sleep(PLAYBACK_END_TOLERANCE);
133f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                Log.v(TAG, "CurrentPosition = " + mp.getCurrentPosition());
134999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                if ( mp.isPlaying() || mp.getCurrentPosition()
135999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau                        > (video_duration)){
136f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                    assertTrue("Current PlayTime greater than duration", false);
137f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                }
138f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau                mp.release();
139f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau            }
140f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
141f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        } catch (Exception e) {
142f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau            Log.v(TAG, e.toString());
143b1ce51fb73b6d7ad5773e06ec32dedc6e4d42f4aYu Shan Emily Lau            assertTrue("testStressGetCurrentPosition", false);
144f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau        }
145f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau    }
146f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau}
147f47b8e991f60aac8a8f4e6e710cf5eb7cfb3a05aYu Shan Emily Lau
148