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