19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 32ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License at 72ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 92ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau * 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, WITHOUT 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License for the specific language governing permissions and limitations under 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.mediaframeworktest.performance; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaFrameworkTest; 2062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport com.android.mediaframeworktest.MediaFrameworkPerfTestRunner; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaNames; 2262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport com.android.mediaframeworktest.MediaTestUtil; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 2530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lauimport android.hardware.Camera; 2630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lauimport android.hardware.Camera.PreviewCallback; 279c539e8511c88419b2f9bdf7d5aad6f91e521c7dYu Shan Emily Lauimport android.media.CamcorderProfile; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder; 30a985135daa0d1706d8f62fa2d845590ce270e214James Dongimport android.media.EncoderCapabilities.VideoEncoderCap; 3159411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Liimport android.os.ConditionVariable; 3230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lauimport android.os.Looper; 3362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38a985135daa0d1706d8f62fa2d845590ce270e214James Dongimport java.util.List; 3999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport java.io.BufferedReader; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 4299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport java.io.InputStreamReader; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Writer; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileWriter; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48a56e653130f2253edb97fe3a5feb18789c29ec9eYu Shan Emily Lauimport com.android.mediaframeworktest.MediaProfileReader; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 512ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau * Junit / Instrumentation - performance measurement for media player and 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder 53a985135daa0d1706d8f62fa2d845590ce270e214James Dong * 54a985135daa0d1706d8f62fa2d845590ce270e214James Dong * FIXME: 55a985135daa0d1706d8f62fa2d845590ce270e214James Dong * Add tests on H264 video encoder 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5762f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupublic class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59568d91bddce4f8b9a05ba98014cf485967344ebaXia Wang private String TAG = "MediaPlayerPerformance"; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SurfaceHolder mSurfaceHolder = null; 62327420252cccbc302fdfe86cfef92711ed6f1c06Yu Shan Emily Lau private static final int NUM_STRESS_LOOP = 10; 63327420252cccbc302fdfe86cfef92711ed6f1c06Yu Shan Emily Lau private static final int NUM_PLAYBACk_IN_EACH_LOOP = 20; 64c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau private static final int SHORT_WAIT = 2 * 1000; // 2 seconds 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long MEDIA_STRESS_WAIT_TIME = 5000; //5 seconds 66a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau private static final String MEDIA_MEMORY_OUTPUT = 67a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau "/sdcard/mediaMemOutput.txt"; 6899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau private static final String MEDIA_PROCMEM_OUTPUT = 6999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau "/sdcard/mediaProcmemOutput.txt"; 70e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau private static final int CAMERA_ID = 0; 71a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau 7201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau private static int mStartMemory = 0; 7301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau private static int mEndMemory = 0; 7401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau private static int mStartPid = 0; 7501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau private static int mEndPid = 0; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private Looper mLooper = null; 7830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private RawPreviewCallback mRawPreviewCallback = new RawPreviewCallback(); 7959411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li private final ConditionVariable mPreviewDone = new ConditionVariable(); 8030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private static int WAIT_FOR_COMMAND_TO_COMPLETE = 10000; // Milliseconds. 8130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 8230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau //the tolerant memory leak 8330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private static int ENCODER_LIMIT = 150; 8430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private static int DECODER_LIMIT = 150; 8530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private static int CAMERA_LIMIT = 80; 8630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 8799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau private Writer mProcMemWriter; 8899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau private Writer mMemWriter; 8999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau 90c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau private CamcorderProfile mCamcorderProfile; 91c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau private int mVideoWidth; 92c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau private int mVideoHeight; 93a985135daa0d1706d8f62fa2d845590ce270e214James Dong 9430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau Camera mCamera; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MediaPlayerPerformance() { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("com.android.mediaframeworktest", MediaFrameworkTest.class); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1002ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau @Override 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setUp() throws Exception { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setUp(); 103c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau //Insert a 2 second before launching the test activity. This is 104c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau //the workaround for the race condition of requesting the updated surface. 105c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau Thread.sleep(SHORT_WAIT); 106c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau getActivity(); 107c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau //Check if the device support the camcorder 108c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau mCamcorderProfile = CamcorderProfile.get(CAMERA_ID); 109c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau if (mCamcorderProfile != null) { 110c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau mVideoWidth = mCamcorderProfile.videoFrameWidth; 111c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau mVideoHeight = mCamcorderProfile.videoFrameHeight; 112c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau Log.v(TAG, "height = " + mVideoHeight + " width= " + mVideoWidth); 113c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau } 11462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau if (MediaFrameworkPerfTestRunner.mGetNativeHeapDump) 11562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau MediaTestUtil.getNativeHeapDump(this.getName() + "_before"); 11699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau 1172ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau if (MediaFrameworkPerfTestRunner.mGetProcmem) { 1182ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau mProcMemWriter = new BufferedWriter(new FileWriter 1192ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau (new File(MEDIA_PROCMEM_OUTPUT), true)); 1202ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau mProcMemWriter.write(this.getName() + "\n"); 1212ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau } 12287b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau mMemWriter = new BufferedWriter(new FileWriter 12387b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau (new File(MEDIA_MEMORY_OUTPUT), true)); 1243662f2011f1c77d0cc1929a0c28a95bebe9cc505Yu Shan Emily Lau mMemWriter.write(this.getName() + "\n"); 12562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau } 12662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau 1272ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau @Override 12862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau protected void tearDown() throws Exception { 12962f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau if (MediaFrameworkPerfTestRunner.mGetNativeHeapDump) 13062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau MediaTestUtil.getNativeHeapDump(this.getName() + "_after"); 1312ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau 1322ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau if (MediaFrameworkPerfTestRunner.mGetProcmem) { 1332ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau mProcMemWriter.close(); 1342ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau } 13587b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau mMemWriter.write("\n"); 13687b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau mMemWriter.close(); 13799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau super.tearDown(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private void initializeMessageLooper() { 14159411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li final ConditionVariable startDone = new ConditionVariable(); 14230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau new Thread() { 14330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau @Override 14430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau public void run() { 14530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau Looper.prepare(); 14630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau Log.v(TAG, "start loopRun"); 14730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau mLooper = Looper.myLooper(); 148e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau mCamera = Camera.open(CAMERA_ID); 14959411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li startDone.open(); 15030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau Looper.loop(); 15130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau Log.v(TAG, "initializeMessageLooper: quit."); 15230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 15330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau }.start(); 15430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 15559411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li if (!startDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) { 15659411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li fail("initializeMessageLooper: start timeout"); 1571cffa446ee92314a09ef767970ee93fa8758c95aYu Shan Emily Lau } 15830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 15930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 16059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li private void terminateMessageLooper() throws Exception { 16159411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li mLooper.quit(); 16259411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li // Looper.quit() is asynchronous. The looper may still has some 16359411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li // preview callbacks in the queue after quit is called. The preview 16459411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li // callback still uses the camera object (setHasPreviewCallback). 16559411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li // After camera is released, RuntimeException will be thrown from 16659411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li // the method. So we need to join the looper thread here. 16759411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li mLooper.getThread().join(); 16859411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li mCamera.release(); 16959411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li } 17059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li 17130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau private final class RawPreviewCallback implements PreviewCallback { 1722ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau @Override 17330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau public void onPreviewFrame(byte[] rawData, Camera camera) { 17459411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li mPreviewDone.open(); 17530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 17630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 17730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 17859411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li private void waitForPreviewDone() { 17959411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li if (!mPreviewDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) { 18059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li Log.v(TAG, "waitForPreviewDone: timeout"); 18159411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li } 18259411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li mPreviewDone.close(); 18359411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li } 18459411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li 18530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau public void stressCameraPreview() { 18648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { 18748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau try { 18848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau initializeMessageLooper(); 18948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mCamera.setPreviewCallback(mRawPreviewCallback); 19048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 19148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mCamera.setPreviewDisplay(mSurfaceHolder); 19248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mCamera.startPreview(); 19348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau waitForPreviewDone(); 19448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Thread.sleep(1000); 19548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau mCamera.stopPreview(); 19648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau terminateMessageLooper(); 19748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } catch (Exception e) { 19848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau Log.v(TAG, e.toString()); 19948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau } 20030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 20130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: This test is to assume the mediaserver's pid is 34 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void mediaStressPlayback(String testFilePath) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaPlayer mp = new MediaPlayer(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.setDataSource(testFilePath); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder()); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.prepare(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.start(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(MEDIA_STRESS_WAIT_TIME); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.release(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp.release(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, e.toString()); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: This test is to assume the mediaserver's pid is 34 2224afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong private boolean stressVideoRecord(int frameRate, int width, int height, int videoFormat, 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outFormat, String outFile, boolean videoOnly) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Video recording 2254afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong boolean doesTestFail = false; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaRecorder mRecorder = new MediaRecorder(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!videoOnly) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setAudioSource"); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFormat(outFormat); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "output format " + outFormat); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(outFile); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoFrameRate(frameRate); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(width, height); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setEncoder"); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(videoFormat); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!videoOnly) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.start(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(MEDIA_STRESS_WAIT_TIME); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.stop(); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 251c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau //Insert 2 seconds to make sure the camera released. 252c10b55a5e4158c31410c7dab2656d46bc4544024Yu Shan Emily Lau Thread.sleep(SHORT_WAIT); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v("record video failed ", e.toString()); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 2564afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong doesTestFail = true; 2574afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong break; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2604afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong return !doesTestFail; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stressAudioRecord(String filePath) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This test is only for the short media file 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaRecorder mRecorder = new MediaRecorder(); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(filePath); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.start(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(MEDIA_STRESS_WAIT_TIME); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.stop(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, e.toString()); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Write the ps output to the file 28599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau public void getMemoryWriteToLog(int writeCount) { 28601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String memusage = null; 28701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau try { 288f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau if (writeCount == 0) { 289f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau mStartMemory = getMediaserverVsize(); 29099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mMemWriter.write("Start memory : " + mStartMemory + "\n"); 291f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau } 292f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau memusage = captureMediaserverInfo(); 29399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mMemWriter.write(memusage); 294f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau if (writeCount == NUM_STRESS_LOOP - 1) { 295f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau mEndMemory = getMediaserverVsize(); 29699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mMemWriter.write("End Memory :" + mEndMemory + "\n"); 297f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau } 29801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau } catch (Exception e) { 29901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau e.toString(); 30001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau } 30101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau } 30201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 3032ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau public void writeProcmemInfo() throws Exception { 3042ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau if (MediaFrameworkPerfTestRunner.mGetProcmem) { 3052ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau String cmd = "procmem " + getMediaserverPid(); 3062ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau Process p = Runtime.getRuntime().exec(cmd); 3072ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau 3082ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau InputStream inStream = p.getInputStream(); 3092ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau InputStreamReader inReader = new InputStreamReader(inStream); 3102ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau BufferedReader inBuffer = new BufferedReader(inReader); 3112ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau String s; 3122ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau while ((s = inBuffer.readLine()) != null) { 3132ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau mProcMemWriter.write(s); 3142ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau mProcMemWriter.write("\n"); 3152ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau } 3162ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau mProcMemWriter.write("\n\n"); 31799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau } 31899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau } 31999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau 32001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau public String captureMediaserverInfo() { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cm = "ps mediaserver"; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String memoryUsage = null; 32301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ch; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Process p = Runtime.getRuntime().exec(cm); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream in = p.getInputStream(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(512); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((ch = in.read()) != -1) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((char) ch); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memoryUsage = sb.toString(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, e.toString()); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] poList = memoryUsage.split("\r|\n|\r\n"); 337780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // A new media.log is enabled with ro.test_harness is set. 338780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // The output of "ps mediaserver" will include the 339780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // media.log process in the first line. Update the parsing 340780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // to only read the thrid line. 341780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // Smaple ps mediaserver output: 342780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // USER PID PPID VSIZE RSS WCHAN PC NAME 343780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // media 131 1 13676 4796 ffffffff 400b1bd0 S media.log 344780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau // media 219 131 37768 6892 ffffffff 400b236c S /system/bin/mediaserver 345c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau String memusage = poList[poList.length-1].concat("\n"); 34601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau return memusage; 34701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau } 34801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 34901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau public int getMediaserverPid(){ 35001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String memoryUsage = null; 35101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau int pidvalue = 0; 35201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau memoryUsage = captureMediaserverInfo(); 35301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String[] poList2 = memoryUsage.split("\t|\\s+"); 35401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String pid = poList2[1]; 35501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau pidvalue = Integer.parseInt(pid); 35601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau Log.v(TAG, "PID = " + pidvalue); 35701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau return pidvalue; 35801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau } 35901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 36001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau public int getMediaserverVsize(){ 36101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String memoryUsage = captureMediaserverInfo(); 36201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String[] poList2 = memoryUsage.split("\t|\\s+"); 36301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau String vsize = poList2[3]; 36401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau int vsizevalue = Integer.parseInt(vsize); 36501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau Log.v(TAG, "VSIZE = " + vsizevalue); 36601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau return vsizevalue; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau public boolean validateMemoryResult(int startPid, int startMemory, int limit) 37030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau throws Exception { 37130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau // Wait for 10 seconds to make sure the memory settle. 372999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau Thread.sleep(10000); 37301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau mEndPid = getMediaserverPid(); 37430daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau int memDiff = mEndMemory - startMemory; 375adc238a97cfbff4405c800994c14e147bc7df2bbYu Shan Emily Lau if (memDiff < 0) { 37630daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau memDiff = 0; 377adc238a97cfbff4405c800994c14e147bc7df2bbYu Shan Emily Lau } 37899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mMemWriter.write("The total diff = " + memDiff); 37999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mMemWriter.write("\n\n"); 38030daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau // mediaserver crash 38130daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau if (startPid != mEndPid) { 38299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mMemWriter.write("mediaserver died. Test failed\n"); 38301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau return false; 384a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau } 38530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau // memory leak greter than the tolerant 38630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau if (memDiff > limit) return false; 38701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau return true; 38801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Test case 1: Capture the memory usage after every 20 h263 playback 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testH263VideoPlaybackMemoryUsage() throws Exception { 39301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau boolean memoryResult = false; 39401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 39599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mStartPid = getMediaserverPid(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_STRESS_LOOP; i++) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaStressPlayback(MediaNames.VIDEO_HIGHRES_H263); 39899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau getMemoryWriteToLog(i); 39999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau writeProcmemInfo(); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, DECODER_LIMIT); 40201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau assertTrue("H263 playback memory test", memoryResult); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Test case 2: Capture the memory usage after every 20 h264 playback 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testH264VideoPlaybackMemoryUsage() throws Exception { 40801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau boolean memoryResult = false; 40901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 41099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mStartPid = getMediaserverPid(); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_STRESS_LOOP; i++) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaStressPlayback(MediaNames.VIDEO_H264_AMR); 41399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau getMemoryWriteToLog(i); 41499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau writeProcmemInfo(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, DECODER_LIMIT); 41701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau assertTrue("H264 playback memory test", memoryResult); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 420ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy // Test case 3: Capture the memory usage after every 20 hevc playback 421ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy @LargeTest 422ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy public void testHEVCVideoPlaybackMemoryUsage() throws Exception { 423ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy boolean memoryResult = false; 424ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy 425ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy mStartPid = getMediaserverPid(); 426ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy for (int i = 0; i < NUM_STRESS_LOOP; i++) { 427ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy mediaStressPlayback(MediaNames.VIDEO_HEVC_AAC); 428ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy getMemoryWriteToLog(i); 429ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy writeProcmemInfo(); 430ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy } 431ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy memoryResult = validateMemoryResult(mStartPid, mStartMemory, DECODER_LIMIT); 432ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy assertTrue("HEVC playback memory test", memoryResult); 433ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy } 434ee64575cf725ecb10d91286dcb32a5a51be8efcdNaveen Kumar Ponnusamy 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Test case 4: Capture the memory usage after every 20 video only recorded 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testH263RecordVideoOnlyMemoryUsage() throws Exception { 438c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau if (mCamcorderProfile != null) { 439c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau boolean memoryResult = false; 440c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau mStartPid = getMediaserverPid(); 441c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau int frameRate = MediaProfileReader 442c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau .getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263); 443c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue("H263 video recording frame rate", frameRate != -1); 444c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau for (int i = 0; i < NUM_STRESS_LOOP; i++) { 445c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, 446c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau MediaRecorder.VideoEncoder.H263, MediaRecorder.OutputFormat.MPEG_4, 447c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau MediaNames.RECORDED_VIDEO_3GP, true)); 448c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau getMemoryWriteToLog(i); 449c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau writeProcmemInfo(); 450c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau } 451c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); 452c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue("H263 record only memory test", memoryResult); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Test case 5: Capture the memory usage after every 20 video only recorded 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testMpeg4RecordVideoOnlyMemoryUsage() throws Exception { 459c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau if (mCamcorderProfile != null) { 460c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau boolean memoryResult = false; 461c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau mStartPid = getMediaserverPid(); 462c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau int frameRate = MediaProfileReader.getMaxFrameRateForCodec 463c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau (MediaRecorder.VideoEncoder.MPEG_4_SP); 464c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue("MPEG4 video recording frame rate", frameRate != -1); 465c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau for (int i = 0; i < NUM_STRESS_LOOP; i++) { 466c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, 467c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau MediaRecorder.VideoEncoder.MPEG_4_SP, MediaRecorder.OutputFormat.MPEG_4, 468c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau MediaNames.RECORDED_VIDEO_3GP, true)); 469c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau getMemoryWriteToLog(i); 470c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau writeProcmemInfo(); 471c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau } 472c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); 473c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue("mpeg4 record only memory test", memoryResult); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau // Test case 6: Capture the memory usage after every 20 video and audio 47801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau // recorded 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 480a9015bb24f09b16f1bd643de3bd844923a4d6c31James Dong public void testRecordVideoAudioMemoryUsage() throws Exception { 481c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau if (mCamcorderProfile != null) { 482c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau boolean memoryResult = false; 483c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau mStartPid = getMediaserverPid(); 484c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau int frameRate = MediaProfileReader 485c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau .getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263); 486c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue("H263 video recording frame rate", frameRate != -1); 487c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau for (int i = 0; i < NUM_STRESS_LOOP; i++) { 488c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, 489c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau MediaRecorder.VideoEncoder.H263, MediaRecorder.OutputFormat.MPEG_4, 490c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau MediaNames.RECORDED_VIDEO_3GP, false)); 491c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau getMemoryWriteToLog(i); 492c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau writeProcmemInfo(); 493c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau } 494c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); 495c8d07567761a84afd486afcc35df540e91248c16Yu Shan Emily Lau assertTrue("H263 audio video record memory test", memoryResult); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Test case 7: Capture the memory usage after every 20 audio only recorded 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testRecordAudioOnlyMemoryUsage() throws Exception { 50201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau boolean memoryResult = false; 50301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau 50499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mStartPid = getMediaserverPid(); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_STRESS_LOOP; i++) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stressAudioRecord(MediaNames.RECORDER_OUTPUT); 50799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau getMemoryWriteToLog(i); 50899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau writeProcmemInfo(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); 51101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau assertTrue("audio record only memory test", memoryResult); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 51430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau // Test case 8: Capture the memory usage after every 20 camera preview 51530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau @LargeTest 51630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau public void testCameraPreviewMemoryUsage() throws Exception { 51730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau boolean memoryResult = false; 51830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau 51999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau mStartPid = getMediaserverPid(); 52030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau for (int i = 0; i < NUM_STRESS_LOOP; i++) { 52130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau stressCameraPreview(); 52299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau getMemoryWriteToLog(i); 52399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau writeProcmemInfo(); 52430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 52599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau memoryResult = validateMemoryResult(mStartPid, mStartMemory, CAMERA_LIMIT); 52630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau assertTrue("camera preview memory test", memoryResult); 52730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 529