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;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder;
29a985135daa0d1706d8f62fa2d845590ce270e214James Dongimport android.media.EncoderCapabilities.VideoEncoderCap;
3059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Liimport android.os.ConditionVariable;
3130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lauimport android.os.Looper;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
3362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39a985135daa0d1706d8f62fa2d845590ce270e214James Dongimport java.util.List;
4099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport java.io.BufferedReader;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
4699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport java.io.InputStreamReader;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Writer;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileWriter;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaMetadataRetriever;
53a56e653130f2253edb97fe3a5feb18789c29ec9eYu Shan Emily Lauimport com.android.mediaframeworktest.MediaProfileReader;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
562ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau * Junit / Instrumentation - performance measurement for media player and
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder
58a985135daa0d1706d8f62fa2d845590ce270e214James Dong *
59a985135daa0d1706d8f62fa2d845590ce270e214James Dong * FIXME:
60a985135daa0d1706d8f62fa2d845590ce270e214James Dong * Add tests on H264 video encoder
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
6262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupublic class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64568d91bddce4f8b9a05ba98014cf485967344ebaXia Wang    private String TAG = "MediaPlayerPerformance";
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SQLiteDatabase mDB;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mSurfaceHolder = null;
68327420252cccbc302fdfe86cfef92711ed6f1c06Yu Shan Emily Lau    private static final int NUM_STRESS_LOOP = 10;
69327420252cccbc302fdfe86cfef92711ed6f1c06Yu Shan Emily Lau    private static final int NUM_PLAYBACk_IN_EACH_LOOP = 20;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final long MEDIA_STRESS_WAIT_TIME = 5000; //5 seconds
71a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau    private static final String MEDIA_MEMORY_OUTPUT =
72a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau        "/sdcard/mediaMemOutput.txt";
7399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau    private static final String MEDIA_PROCMEM_OUTPUT =
7499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        "/sdcard/mediaProcmemOutput.txt";
75e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau    private static final int CAMERA_ID = 0;
76a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau
7701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    private static int mStartMemory = 0;
7801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    private static int mEndMemory = 0;
7901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    private static int mStartPid = 0;
8001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    private static int mEndPid = 0;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private Looper mLooper = null;
8330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private RawPreviewCallback mRawPreviewCallback = new RawPreviewCallback();
8459411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li    private final ConditionVariable mPreviewDone = new ConditionVariable();
8530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private static int WAIT_FOR_COMMAND_TO_COMPLETE = 10000;  // Milliseconds.
8630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
8730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    //the tolerant memory leak
8830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private static int ENCODER_LIMIT = 150;
8930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private static int DECODER_LIMIT = 150;
9030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private static int CAMERA_LIMIT = 80;
9130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
9299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau    private Writer mProcMemWriter;
9399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau    private Writer mMemWriter;
9499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
95a985135daa0d1706d8f62fa2d845590ce270e214James Dong    private static List<VideoEncoderCap> videoEncoders = MediaProfileReader.getVideoEncoders();
96a985135daa0d1706d8f62fa2d845590ce270e214James Dong
9730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    Camera mCamera;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaPlayerPerformance() {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1032ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau    @Override
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
106003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau        //Insert a 2 second before launching the test activity. This is
107003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau        //the workaround for the race condition of requesting the updated surface.
108003a7569745640d700c318a463385ca5feb08728Yu Shan Emily Lau        Thread.sleep(2000);
10962f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        getActivity();
11062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        if (MediaFrameworkPerfTestRunner.mGetNativeHeapDump)
11162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau            MediaTestUtil.getNativeHeapDump(this.getName() + "_before");
11299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
1132ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau        if (MediaFrameworkPerfTestRunner.mGetProcmem) {
1142ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            mProcMemWriter = new BufferedWriter(new FileWriter
1152ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau                    (new File(MEDIA_PROCMEM_OUTPUT), true));
1162ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            mProcMemWriter.write(this.getName() + "\n");
1172ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau        }
11887b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau        mMemWriter = new BufferedWriter(new FileWriter
11987b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau                (new File(MEDIA_MEMORY_OUTPUT), true));
1203662f2011f1c77d0cc1929a0c28a95bebe9cc505Yu Shan Emily Lau        mMemWriter.write(this.getName() + "\n");
12162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau    }
12262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
1232ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau    @Override
12462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau    protected void tearDown() throws Exception {
12562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        if (MediaFrameworkPerfTestRunner.mGetNativeHeapDump)
12662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau            MediaTestUtil.getNativeHeapDump(this.getName() + "_after");
1272ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau
1282ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau        if (MediaFrameworkPerfTestRunner.mGetProcmem) {
1292ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            mProcMemWriter.close();
1302ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau        }
13187b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau        mMemWriter.write("\n");
13287b8a1c3b69a7c975ae2a8ebaaef5724f1b09cefYu Shan Emily Lau        mMemWriter.close();
13399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        super.tearDown();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private void initializeMessageLooper() {
13759411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        final ConditionVariable startDone = new ConditionVariable();
13830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        new Thread() {
13930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau            @Override
14030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau            public void run() {
14130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau                Looper.prepare();
14230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau                Log.v(TAG, "start loopRun");
14330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau                mLooper = Looper.myLooper();
144e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau                mCamera = Camera.open(CAMERA_ID);
14559411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li                startDone.open();
14630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau                Looper.loop();
14730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau                Log.v(TAG, "initializeMessageLooper: quit.");
14830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau            }
14930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        }.start();
15030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
15159411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        if (!startDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
15259411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li            fail("initializeMessageLooper: start timeout");
1531cffa446ee92314a09ef767970ee93fa8758c95aYu Shan Emily Lau        }
15430a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    }
15530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
15659411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li    private void terminateMessageLooper() throws Exception {
15759411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        mLooper.quit();
15859411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        // Looper.quit() is asynchronous. The looper may still has some
15959411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        // preview callbacks in the queue after quit is called. The preview
16059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        // callback still uses the camera object (setHasPreviewCallback).
16159411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        // After camera is released, RuntimeException will be thrown from
16259411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        // the method. So we need to join the looper thread here.
16359411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        mLooper.getThread().join();
16459411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        mCamera.release();
16559411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li    }
16659411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li
16730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    private final class RawPreviewCallback implements PreviewCallback {
1682ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau        @Override
16930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        public void onPreviewFrame(byte[] rawData, Camera camera) {
17059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li            mPreviewDone.open();
17130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        }
17230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    }
17330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
17459411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li    private void waitForPreviewDone() {
17559411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        if (!mPreviewDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
17659411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li            Log.v(TAG, "waitForPreviewDone: timeout");
17759411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        }
17859411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li        mPreviewDone.close();
17959411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li    }
18059411b3373dca7582aa1a248d4cff4c2330ee224Wu-cheng Li
18130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    public void stressCameraPreview() {
18248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau        for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) {
18348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            try {
18448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                initializeMessageLooper();
18548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mCamera.setPreviewCallback(mRawPreviewCallback);
18648584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
18748584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mCamera.setPreviewDisplay(mSurfaceHolder);
18848584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mCamera.startPreview();
18948584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                waitForPreviewDone();
19048584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Thread.sleep(1000);
19148584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                mCamera.stopPreview();
19248584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                terminateMessageLooper();
19348584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            } catch (Exception e) {
19448584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau                Log.v(TAG, e.toString());
19548584d7b8f5e56b73bb13180bf6546b2647c1b28Yu Shan Emily Lau            }
19630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        }
19730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Note: This test is to assume the mediaserver's pid is 34
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mediaStressPlayback(String testFilePath) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MediaPlayer mp = new MediaPlayer();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.setDataSource(testFilePath);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.prepare();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.start();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(MEDIA_STRESS_WAIT_TIME);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.release();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mp.release();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, e.toString());
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Note: This test is to assume the mediaserver's pid is 34
2184afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong    private boolean stressVideoRecord(int frameRate, int width, int height, int videoFormat,
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int outFormat, String outFile, boolean videoOnly) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Video recording
2214afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong        boolean doesTestFail = false;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MediaRecorder mRecorder = new MediaRecorder();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!videoOnly) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "setAudioSource");
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFormat(outFormat);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "output format " + outFormat);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFile(outFile);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoFrameRate(frameRate);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoSize(width, height);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setEncoder");
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setVideoEncoder(videoFormat);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!videoOnly) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.prepare();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.start();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(MEDIA_STRESS_WAIT_TIME);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.stop();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.release();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v("record video failed ", e.toString());
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.release();
2504afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong                doesTestFail = true;
2514afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong                break;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2544afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong        return !doesTestFail;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stressAudioRecord(String filePath) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This test is only for the short media file
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_PLAYBACk_IN_EACH_LOOP; i++) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MediaRecorder mRecorder = new MediaRecorder();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setOutputFile(filePath);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.prepare();
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.start();
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(MEDIA_STRESS_WAIT_TIME);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.stop();
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.release();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, e.toString());
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.release();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //Write the ps output to the file
27999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau    public void getMemoryWriteToLog(int writeCount) {
28001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String memusage = null;
28101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        try {
282f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau            if (writeCount == 0) {
283f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau                mStartMemory = getMediaserverVsize();
28499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau                mMemWriter.write("Start memory : " + mStartMemory + "\n");
285f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau            }
286f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau            memusage = captureMediaserverInfo();
28799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            mMemWriter.write(memusage);
288f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau            if (writeCount == NUM_STRESS_LOOP - 1) {
289f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau                mEndMemory = getMediaserverVsize();
29099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau                mMemWriter.write("End Memory :" + mEndMemory + "\n");
291f465dc0367534bf38c2c655cd147437848b67907Yu Shan Emily Lau            }
29201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        } catch (Exception e) {
29301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau            e.toString();
29401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        }
29501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    }
29601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
2972ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau    public void writeProcmemInfo() throws Exception {
2982ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau        if (MediaFrameworkPerfTestRunner.mGetProcmem) {
2992ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            String cmd = "procmem " + getMediaserverPid();
3002ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            Process p = Runtime.getRuntime().exec(cmd);
3012ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau
3022ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            InputStream inStream = p.getInputStream();
3032ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            InputStreamReader inReader = new InputStreamReader(inStream);
3042ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            BufferedReader inBuffer = new BufferedReader(inReader);
3052ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            String s;
3062ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            while ((s = inBuffer.readLine()) != null) {
3072ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau                mProcMemWriter.write(s);
3082ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau                mProcMemWriter.write("\n");
3092ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            }
3102ffd20753e9c187c057b2b8f1e65cfddc901c8e9Yu Shan Emily Lau            mProcMemWriter.write("\n\n");
31199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        }
31299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau    }
31399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
31401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    public String captureMediaserverInfo() {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cm = "ps mediaserver";
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String memoryUsage = null;
31701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int ch;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Process p = Runtime.getRuntime().exec(cm);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream in = p.getInputStream();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuffer sb = new StringBuffer(512);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while ((ch = in.read()) != -1) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append((char) ch);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            memoryUsage = sb.toString();
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, e.toString());
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] poList = memoryUsage.split("\r|\n|\r\n");
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String memusage = poList[1].concat("\n");
33201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        return memusage;
33301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    }
33401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
33501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    public int getMediaserverPid(){
33601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String memoryUsage = null;
33701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        int pidvalue = 0;
33801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        memoryUsage = captureMediaserverInfo();
33901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String[] poList2 = memoryUsage.split("\t|\\s+");
34001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String pid = poList2[1];
34101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        pidvalue = Integer.parseInt(pid);
34201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        Log.v(TAG, "PID = " + pidvalue);
34301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        return pidvalue;
34401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    }
34501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
34601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    public int getMediaserverVsize(){
34701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String memoryUsage = captureMediaserverInfo();
34801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String[] poList2 = memoryUsage.split("\t|\\s+");
34901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        String vsize = poList2[3];
35001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        int vsizevalue = Integer.parseInt(vsize);
35101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        Log.v(TAG, "VSIZE = " + vsizevalue);
35201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        return vsizevalue;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau    public boolean validateMemoryResult(int startPid, int startMemory, int limit)
35630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau            throws Exception {
35730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        // Wait for 10 seconds to make sure the memory settle.
358999101368fc6b8163e0b9e320239e49ca62f3e4aYu Shan Emily Lau        Thread.sleep(10000);
35901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        mEndPid = getMediaserverPid();
36030daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau        int memDiff = mEndMemory - startMemory;
361adc238a97cfbff4405c800994c14e147bc7df2bbYu Shan Emily Lau        if (memDiff < 0) {
36230daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau            memDiff = 0;
363adc238a97cfbff4405c800994c14e147bc7df2bbYu Shan Emily Lau        }
36499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mMemWriter.write("The total diff = " + memDiff);
36599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mMemWriter.write("\n\n");
36630daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau        // mediaserver crash
36730daf09cb6e74be45c5b594569002c0eb9f9ed7dYu Shan Emily Lau        if (startPid != mEndPid) {
36899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            mMemWriter.write("mediaserver died. Test failed\n");
36901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau            return false;
370a74603052b525e7c8709ffc3b618af0a8b140f0bYu Shan Emily Lau        }
37130a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        // memory leak greter than the tolerant
37230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        if (memDiff > limit) return false;
37301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        return true;
37401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test case 1: Capture the memory usage after every 20 h263 playback
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testH263VideoPlaybackMemoryUsage() throws Exception {
37901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        boolean memoryResult = false;
38001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
38199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaStressPlayback(MediaNames.VIDEO_HIGHRES_H263);
38499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
38599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, DECODER_LIMIT);
38801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        assertTrue("H263 playback memory test", memoryResult);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test case 2: Capture the memory usage after every 20 h264 playback
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testH264VideoPlaybackMemoryUsage() throws Exception {
39401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        boolean memoryResult = false;
39501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
39699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaStressPlayback(MediaNames.VIDEO_H264_AMR);
39999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
40099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, DECODER_LIMIT);
40301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        assertTrue("H264 playback memory test", memoryResult);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test case 4: Capture the memory usage after every 20 video only recorded
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testH263RecordVideoOnlyMemoryUsage() throws Exception {
40901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        boolean memoryResult = false;
41001c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
41199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
412b05a600352dcd4517c62c7503edf9eea22359280James Dong        int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263);
413a985135daa0d1706d8f62fa2d845590ce270e214James Dong        assertTrue("H263 video recording frame rate", frameRate != -1);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
415a985135daa0d1706d8f62fa2d845590ce270e214James Dong            assertTrue(stressVideoRecord(frameRate, 352, 288, MediaRecorder.VideoEncoder.H263,
4164afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong                    MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true));
41799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
41899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT);
42101c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        assertTrue("H263 record only memory test", memoryResult);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test case 5: Capture the memory usage after every 20 video only recorded
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testMpeg4RecordVideoOnlyMemoryUsage() throws Exception {
42701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        boolean memoryResult = false;
42801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
42999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
430b05a600352dcd4517c62c7503edf9eea22359280James Dong        int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.MPEG_4_SP);
431a985135daa0d1706d8f62fa2d845590ce270e214James Dong        assertTrue("MPEG4 video recording frame rate", frameRate != -1);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
433a985135daa0d1706d8f62fa2d845590ce270e214James Dong            assertTrue(stressVideoRecord(frameRate, 352, 288, MediaRecorder.VideoEncoder.MPEG_4_SP,
4344afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong                    MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true));
43599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
43699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT);
43901c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        assertTrue("mpeg4 record only memory test", memoryResult);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44201c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    // Test case 6: Capture the memory usage after every 20 video and audio
44301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau    // recorded
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
445a9015bb24f09b16f1bd643de3bd844923a4d6c31James Dong    public void testRecordVideoAudioMemoryUsage() throws Exception {
44601c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        boolean memoryResult = false;
44701c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
44899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
449b05a600352dcd4517c62c7503edf9eea22359280James Dong        int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263);
450a985135daa0d1706d8f62fa2d845590ce270e214James Dong        assertTrue("H263 video recording frame rate", frameRate != -1);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
452a985135daa0d1706d8f62fa2d845590ce270e214James Dong            assertTrue(stressVideoRecord(frameRate, 352, 288, MediaRecorder.VideoEncoder.H263,
4534afbe2ec7560bfa2637841802cf01cfbd01187e3James Dong                    MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, false));
45499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
45599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT);
45801c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        assertTrue("H263 audio video record memory test", memoryResult);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test case 7: Capture the memory usage after every 20 audio only recorded
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testRecordAudioOnlyMemoryUsage() throws Exception {
46401c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        boolean memoryResult = false;
46501c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau
46699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stressAudioRecord(MediaNames.RECORDER_OUTPUT);
46999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
47099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT);
47301c0596b75388e3df7cb4fb022d904c4cac9d831Yu Shan Emily Lau        assertTrue("audio record only memory test", memoryResult);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47530a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
47630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    // Test case 8: Capture the memory usage after every 20 camera preview
47730a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    @LargeTest
47830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    public void testCameraPreviewMemoryUsage() throws Exception {
47930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        boolean memoryResult = false;
48030a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau
48199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        mStartPid = getMediaserverPid();
48230a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
48330a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau            stressCameraPreview();
48499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            getMemoryWriteToLog(i);
48599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            writeProcmemInfo();
48630a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        }
48799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        memoryResult = validateMemoryResult(mStartPid, mStartMemory, CAMERA_LIMIT);
48830a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau        assertTrue("camera preview memory test", memoryResult);
48930a13908197c03c7f660f443064575c7baa889bbYu Shan Emily Lau    }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
491