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