19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
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,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17db6028508c8eb31a0de1dcdfc410ddfe6df7c5adXia Wangpackage com.android.mediaframeworktest.functional.mediarecorder;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaFrameworkTest;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaNames;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.*;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
25e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhangimport android.graphics.Canvas;
26e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhangimport android.graphics.Color;
27e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhangimport android.graphics.Paint;
28e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhangimport android.graphics.Typeface;
292071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lauimport android.hardware.Camera;
30ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhangimport android.media.MediaCodec;
31699780f54b7ddd7b00f891218140df663b3ab84eChong Zhangimport android.media.MediaMetadataRetriever;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder;
341b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities;
351b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.VideoEncoderCap;
361b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.AudioEncoderCap;
3762f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
39e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhangimport android.view.Surface;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceView;
421619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaProfileReader;
4399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaFrameworkTestRunner;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress;
471b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport java.util.List;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
51e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang * Junit / Instrumentation test case for the media recorder api
52e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang */
5362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupublic class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String TAG = "MediaRecorderTest";
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOutputDuration =0;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOutputVideoWidth = 0;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOutputVideoHeight= 0 ;
58e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mSurfaceHolder = null;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MediaRecorder mRecorder;
611619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
621619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    private int MIN_VIDEO_FPS = 5;
63daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    private int HIGH_SPEED_FPS = 120;
641619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
65e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau    private static final int CAMERA_ID = 0;
66e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
682071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    Camera mCamera;
69e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaRecorderTest() {
71e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        super(MediaFrameworkTest.class);
72e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
7662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        getActivity();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRecorder = new MediaRecorder();
7862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        super.setUp();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
80e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
81e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    private void recordVideo(int frameRate, int width, int height,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int videoFormat, int outFormat, String outFile, boolean videoOnly) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG,"startPreviewAndPrepareRecording");
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setAudioSource");
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFormat(outFormat);
91e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "output format " + outFormat);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFile(outFile);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoFrameRate(frameRate);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSize(width, height);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setEncoder");
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoEncoder(videoFormat);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setPreview");
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "prepare");
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.prepare();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "start");
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.start();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(MediaNames.RECORDED_TIME);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "stop");
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.stop();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("record video failed ", e.toString());
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
116e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
117e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    private boolean validateGetSurface(boolean useSurface) {
118e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        Log.v(TAG,"validateGetSurface, useSurface=" + useSurface);
119e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        MediaRecorder recorder = new MediaRecorder();
120e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        Surface surface;
121e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        boolean success = true;
122e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
123e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* initialization */
124e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (!useSurface) {
125e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera = Camera.open(CAMERA_ID);
126e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                Camera.Parameters parameters = mCamera.getParameters();
127e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                parameters.setPreviewSize(352, 288);
128e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                parameters.set("orientation", "portrait");
129e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.setParameters(parameters);
130e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.unlock();
131e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setCamera(mCamera);
132e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
133e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setPreviewDisplay(mSurfaceHolder.getSurface());
134e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
135e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
136e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
137e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int videoSource = useSurface ?
138e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    MediaRecorder.VideoSource.SURFACE :
139e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    MediaRecorder.VideoSource.CAMERA;
140e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSource(videoSource);
141e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
142e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFile(MediaNames.RECORDED_SURFACE_3GP);
143e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoFrameRate(30);
144e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSize(352, 288);
145e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
146e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
147e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
148e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() before prepare()
149e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should throw IllegalStateException
150e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
151e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
152e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
153e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                throw new Exception("getSurface failed to throw IllegalStateException");
154e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
155e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // OK
156e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
157e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
158e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.prepare();
159e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
160e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() after prepare()
161e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should succeed for surface source
162e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should fail for camera source
163e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
164e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
165e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
166e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!useSurface) {
167e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
168e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
169e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
170e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (useSurface) {
171e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
172e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
173e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
174e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
175e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.start();
176e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
177e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() after start()
178e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should succeed for surface source
179e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should fail for camera source
180e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
181e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
182e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
183e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!useSurface) {
184e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
185e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
186e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
187e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (useSurface) {
188e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
189e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
190e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
191e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
192e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
193e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.stop();
194e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (Exception e) {
195e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // stop() could fail if the recording is empty, as we didn't render anything.
196e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // ignore any failure in stop, we just want it stopped.
197e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
198e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
199e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() after stop()
200e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should throw IllegalStateException
201e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
202e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
203e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
204e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                throw new Exception("getSurface failed to throw IllegalStateException");
205e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
206e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // OK
207e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
208e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
209e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            // fail
210e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            success = false;
211e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
212e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
213e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
214e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (mCamera != null) {
215e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.lock();
216e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.release();
217e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera = null;
218e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
219e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.release();
220e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
221e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            success = false;
222e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
223e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
224e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        return success;
225e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
226e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
227daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    private boolean recordVideoFromSurface(
228daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            int frameRate, int captureRate, int width, int height,
229ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            int videoFormat, int outFormat, String outFile, boolean videoOnly,
230ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            Surface persistentSurface) {
231e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        Log.v(TAG,"recordVideoFromSurface");
232e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        MediaRecorder recorder = new MediaRecorder();
233daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        int sleepTime = 33; // normal capture at 33ms / frame
234ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        Surface surface = null;
235e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
236e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (!videoOnly) {
237e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
238e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
239e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
240e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFormat(outFormat);
241e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFile(outFile);
242e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoFrameRate(frameRate);
243daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            if (captureRate > 0) {
244daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                recorder.setCaptureRate(captureRate);
245daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                sleepTime = 1000 / captureRate;
246daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            }
247e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSize(width, height);
248e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoEncoder(videoFormat);
249e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (!videoOnly) {
250e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
251e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
252ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            if (persistentSurface != null) {
253ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                Log.v(TAG, "using persistent surface");
254ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                surface = persistentSurface;
2559560ddb48af0e2da7743452f8d9d6d9cd34d8438Chong Zhang                recorder.setInputSurface(surface);
256ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            }
257e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.prepare();
258ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            if (persistentSurface == null) {
259ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                surface = recorder.getSurface();
260ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            }
261e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
262e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Paint paint = new Paint();
263e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            paint.setTextSize(16);
264e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            paint.setColor(Color.RED);
265e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int i;
266e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
267e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: draw 10 frames at 30fps before start
268e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * these should be dropped and not causing malformed stream.
269e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
270e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for(i = 0; i < 10; i++) {
271e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                Canvas canvas = surface.lockCanvas(null);
272e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                int background = (i * 255 / 99);
273e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawARGB(255, background, background, background);
274e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                String text = "Frame #" + i;
275e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawText(text, 100, 100, paint);
276e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface.unlockCanvasAndPost(canvas);
277daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                Thread.sleep(sleepTime);
278e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
279e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
280e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "start");
281e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.start();
282e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
283e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: draw another 90 frames at 30fps after start */
284e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for(i = 10; i < 100; i++) {
285e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                Canvas canvas = surface.lockCanvas(null);
286e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                int background = (i * 255 / 99);
287e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawARGB(255, background, background, background);
288e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                String text = "Frame #" + i;
289e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawText(text, 100, 100, paint);
290e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface.unlockCanvasAndPost(canvas);
291daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                Thread.sleep(sleepTime);
292e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
293e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
294e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "stop");
295e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.stop();
296e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
297ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            Log.v(TAG, "record video failed: " + e.toString());
298e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            return false;
299ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        } finally {
300ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            recorder.release();
301ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            // release surface if not using persistent surface
302ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            if (persistentSurface == null && surface != null) {
303ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                surface.release();
304ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            }
305e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
306e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        return true;
307e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
308e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
3091b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private boolean recordVideoWithPara(VideoEncoderCap videoCap, AudioEncoderCap audioCap, boolean highQuality){
3101619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        boolean recordSuccess = false;
3111b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoEncoder = videoCap.mCodec;
3121b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioEncoder = audioCap.mCodec;
3131b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoWidth = highQuality? videoCap.mMaxFrameWidth: videoCap.mMinFrameWidth;
3141b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoHeight = highQuality? videoCap.mMaxFrameHeight: videoCap.mMinFrameHeight;
3151b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoFps = highQuality? videoCap.mMaxFrameRate: videoCap.mMinFrameRate;
3161b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoBitrate = highQuality? videoCap.mMaxBitRate: videoCap.mMinBitRate;
3171b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioBitrate = highQuality? audioCap.mMaxBitRate: audioCap.mMinBitRate;
3181b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioChannels = highQuality? audioCap.mMaxChannels: audioCap.mMinChannels ;
3191b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioSamplingRate = highQuality? audioCap.mMaxSampleRate: audioCap.mMinSampleRate;
3201619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
32199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        //Overide the fps if the min_camera_fps is set
32299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        if (MediaFrameworkTestRunner.mMinCameraFps != 0 &&
32399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            MediaFrameworkTestRunner.mMinCameraFps > videoFps){
32499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            videoFps = MediaFrameworkTestRunner.mMinCameraFps;
32599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        }
32699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
3271619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        if (videoFps < MIN_VIDEO_FPS) {
3281619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            videoFps = MIN_VIDEO_FPS;
3291619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        }
33099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
3311619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
3321b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        String filename = ("/sdcard/" + videoEncoder + "_" + audioEncoder + "_" + highQuality + ".3gp");
3331619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        try {
334620a4240366f13c3359c6825c92e831563cc11b6James Dong            Log.v(TAG, "video encoder : " + videoEncoder);
335620a4240366f13c3359c6825c92e831563cc11b6James Dong            Log.v(TAG, "audio encoder : " + audioEncoder);
3361b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            Log.v(TAG, "quality : " + (highQuality?"high": "low"));
3371b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            Log.v(TAG, "encoder : " + MediaProfileReader.getVideoCodecName(videoEncoder));
3381b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            Log.v(TAG, "audio : " + MediaProfileReader.getAudioCodecName(audioEncoder));
3391619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videoWidth : " + videoWidth);
3401619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videoHeight : " + videoHeight);
3411619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videoFPS : " + videoFps);
3421619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videobitrate : " + videoBitrate);
3431619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "audioBitrate : " + audioBitrate);
3441619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "audioChannel : " + audioChannels);
3451619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "AudioSampleRate : " + audioSamplingRate);
3461619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
3471619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            MediaRecorder mMediaRecorder = new MediaRecorder();
3481619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
3491619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
3501619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
3511619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setOutputFile(filename);
3521619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoFrameRate(videoFps);
3531619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoSize(videoWidth, videoHeight);
3540fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setVideoEncodingBitRate(videoBitrate);
3550fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setAudioEncodingBitRate(audioBitrate);
3560fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setAudioChannels(audioChannels);
3570fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setAudioSamplingRate(audioSamplingRate);
3581619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoEncoder(videoEncoder);
3591619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setAudioEncoder(audioEncoder);
3601619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
3611619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.prepare();
3621619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.start();
3631619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Thread.sleep(MediaNames.RECORDED_TIME);
3641619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.stop();
3651619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.release();
3661619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            recordSuccess = validateVideo(filename, videoWidth, videoHeight);
3671619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        } catch (Exception e) {
3681619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, e.toString());
3691619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            return false;
3701619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        }
3711619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        return recordSuccess;
3721619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
3731619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
374e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    private boolean invalidRecordSetting(int frameRate, int width, int height,
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int videoFormat, int outFormat, String outFile, boolean videoOnly) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setAudioSource");
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFormat(outFormat);
383e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "output format " + outFormat);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFile(outFile);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoFrameRate(frameRate);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSize(width, height);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setEncoder");
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoEncoder(videoFormat);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setPreview");
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "prepare");
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.prepare();
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "start");
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.start();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(MediaNames.RECORDED_TIME);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "stop");
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.stop();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("record video failed ", e.toString());
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "reset and release");
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
411e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void getOutputVideoProperty(String outputFilePath) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaPlayer mediaPlayer = new MediaPlayer();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.setDataSource(outputFilePath);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "file Path = " + outputFilePath);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "before player prepare");
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.prepare();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "before getduration");
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOutputDuration = mediaPlayer.getDuration();
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "get video dimension");
42317d7ea4947dfad101ae689f3b717ba0a52945155Yu Shan Emily Lau            Thread.sleep(1000);
424bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau            mOutputVideoHeight = mediaPlayer.getVideoHeight();
425bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau            mOutputVideoWidth = mediaPlayer.getVideoWidth();
426e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            mediaPlayer.release();
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, e.toString());
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.release();
430e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
432e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean validateVideo(String filePath, int width, int height) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean validVideo = false;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getOutputVideoProperty(filePath);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOutputVideoWidth == width && mOutputVideoHeight == height &&
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOutputDuration > MediaNames.VALID_VIDEO_DURATION ) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            validVideo = true;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "width = " + mOutputVideoWidth + " height = " + mOutputVideoHeight + " Duration = " + mOutputDuration);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return validVideo;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
444699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang    private boolean validateMetadata(String filePath, int captureRate) {
445699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
446699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang
447699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        retriever.setDataSource(filePath);
448699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang
449699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        // verify capture rate meta key is present and correct
450699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        String captureFps = retriever.extractMetadata(
451699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE);
452699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang
453699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        if (captureFps == null) {
454699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang            Log.d(TAG, "METADATA_KEY_CAPTURE_FRAMERATE is missing");
455699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang            return false;
456699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        }
457699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang
458699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        if (Math.abs(Float.parseFloat(captureFps) - captureRate) > 0.001) {
459699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang            Log.d(TAG, "METADATA_KEY_CAPTURE_FRAMERATE is incorrect: "
460699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                    + captureFps + "vs. " + captureRate);
461699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang            return false;
462699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        }
463699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang
464699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        // verify other meta keys here if necessary
465699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang        return true;
466699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang    }
4672071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    @LargeTest
4682071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    /*
4692071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau     * This test case set the camera in portrait mode.
4702071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau     * Verification: validate the video dimension and the duration.
4712071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau     */
4722071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    public void testPortraitH263() throws Exception {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean videoRecordedResult = false;
4742071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau        try {
475e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau            mCamera = Camera.open(CAMERA_ID);
4762071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            Camera.Parameters parameters = mCamera.getParameters();
4772071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            parameters.setPreviewSize(352, 288);
4782071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            parameters.set("orientation", "portrait");
4792071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.setParameters(parameters);
4802071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.unlock();
4812071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mRecorder.setCamera(mCamera);
4822071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            Thread.sleep(1000);
483b05a600352dcd4517c62c7503edf9eea22359280James Dong            int codec = MediaRecorder.VideoEncoder.H263;
484b05a600352dcd4517c62c7503edf9eea22359280James Dong            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
485b05a600352dcd4517c62c7503edf9eea22359280James Dong            recordVideo(frameRate, 352, 288, codec,
486e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    MediaRecorder.OutputFormat.THREE_GPP,
4872071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau                    MediaNames.RECORDED_PORTRAIT_H263, true);
4882071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.lock();
4892071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.release();
490bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau            videoRecordedResult =
491bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau                validateVideo(MediaNames.RECORDED_PORTRAIT_H263, 352, 288);
4922071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau        } catch (Exception e) {
4932071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            Log.v(TAG, e.toString());
4942071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau        }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("PortraitH263", videoRecordedResult);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
497e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
499e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    public void testInvalidVideoPath() throws Exception {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isTestInvalidVideoPathSuccessful = false;
501e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        isTestInvalidVideoPathSuccessful = invalidRecordSetting(15, 176, 144, MediaRecorder.VideoEncoder.H263,
502e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang               MediaRecorder.OutputFormat.THREE_GPP, MediaNames.INVALD_VIDEO_PATH, false);
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Invalid outputFile Path", isTestInvalidVideoPathSuccessful);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
505e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
5061619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    @LargeTest
507dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau    //test cases for the new codec
5081619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    public void testDeviceSpecificCodec() throws Exception {
509dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau        int noOfFailure = 0;
5101619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        boolean recordSuccess = false;
5111619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        String deviceType = MediaProfileReader.getDeviceType();
5121619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        Log.v(TAG, "deviceType = " + deviceType);
5131b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        List<VideoEncoderCap> videoEncoders = MediaProfileReader.getVideoEncoders();
5141b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        List<AudioEncoderCap> audioEncoders = MediaProfileReader.getAudioEncoders();
5151b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        for (int k = 0; k < 2; k++) {
5161b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            for (VideoEncoderCap videoEncoder: videoEncoders) {
5171b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                for (AudioEncoderCap audioEncoder: audioEncoders) {
5181b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    if (k == 0) {
5191b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, true);
5201b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    } else {
5211b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, false);
5221b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    }
5231b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    if (!recordSuccess) {
5241b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        Log.v(TAG, "testDeviceSpecificCodec failed");
5251b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        Log.v(TAG, "Encoder = " + videoEncoder.mCodec + "Audio Encoder = " + audioEncoder.mCodec);
5261b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        noOfFailure++;
5271619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau                    }
5281619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau                }
5291619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            }
5301b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        }
5311b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        if (noOfFailure != 0) {
5321b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            assertTrue("testDeviceSpecificCodec", false);
533dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau        }
5341619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
535e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
536e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    // Test MediaRecorder.getSurface() api with surface or camera source
537e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    public void testGetSurfaceApi() {
538e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        boolean success = false;
539e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        int noOfFailure = 0;
540e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
541e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for (int k = 0; k < 2; k++) {
542e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                success = validateGetSurface(
543e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                        k == 0 ? true : false /* useSurface */);
544e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!success) {
545e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    noOfFailure++;
546e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
547e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
548e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
549e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, e.toString());
550e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
551e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        assertTrue("testGetSurfaceApi", noOfFailure == 0);
552e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
553e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
554e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    // Test recording from surface source with/without audio
555e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    public void testSurfaceRecording() {
556e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        boolean success = false;
557e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        int noOfFailure = 0;
558e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
559e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int codec = MediaRecorder.VideoEncoder.H264;
560e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
561e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for (int k = 0; k < 2; k++) {
562e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                String filename = "/sdcard/surface_" +
563e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                            (k==0?"video_only":"with_audio") + ".3gp";
564e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
565daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                success = recordVideoFromSurface(frameRate, 0, 352, 288, codec,
566e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                        MediaRecorder.OutputFormat.THREE_GPP, filename,
567ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                        k == 0 ? true : false /* videoOnly */, null);
568e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (success) {
569e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    success = validateVideo(filename, 352, 288);
570e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
571e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!success) {
572e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    noOfFailure++;
573e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
574e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
575e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
576e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, e.toString());
577e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
578e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        assertTrue("testSurfaceRecording", noOfFailure == 0);
579e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
580daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang
581ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang    public void testPersistentSurfaceRecording() {
582ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        boolean success = false;
583ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        int noOfFailure = 0;
584ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        Surface surface = null;
585ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        try {
586ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            int codec = MediaRecorder.VideoEncoder.H264;
587ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
588ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            surface = MediaCodec.createPersistentInputSurface();
589ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            for (int k = 0; k < 2; k++) {
590ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                String filename = "/sdcard/surface_persistent" + k + ".3gp";
591ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang
592ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                Log.v(TAG, "test persistent surface - round " + k);
593ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                success = recordVideoFromSurface(frameRate, 0, 352, 288, codec,
594ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                        MediaRecorder.OutputFormat.THREE_GPP, filename,
595ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                        true /* videoOnly */, surface);
596ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                if (success) {
597ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                    success = validateVideo(filename, 352, 288);
598ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                }
599ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                if (!success) {
600ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                    noOfFailure++;
601ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                }
602ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            }
603ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        } catch (Exception e) {
604ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            Log.v(TAG, e.toString());
605ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        } finally {
606ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            if (surface != null) {
607ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                Log.v(TAG, "releasing persistent surface");
608ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                surface.release();
609ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                surface = null;
610ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang            }
611ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        }
612ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang        assertTrue("testPersistentSurfaceRecording", noOfFailure == 0);
613ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang    }
614ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang
615daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    // Test recording from surface source with/without audio
616daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    public void testSurfaceRecordingTimeLapse() {
617daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        boolean success = false;
618daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        int noOfFailure = 0;
619daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        try {
620daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            int codec = MediaRecorder.VideoEncoder.H264;
621daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
622daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            for (int k = 0; k < 2; k++) {
623daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // k==0: time lapse test, set capture rate to MIN_VIDEO_FPS
624daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // k==1: slow motion test, set capture rate to HIGH_SPEED_FPS
625daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                String filename = "/sdcard/surface_" +
626daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                            (k==0 ? "time_lapse" : "slow_motion") + ".3gp";
627daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang
628daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // always set videoOnly=false, MediaRecorder should disable
629daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // audio automatically with time lapse/slow motion
630699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                int captureRate = k==0 ? MIN_VIDEO_FPS : HIGH_SPEED_FPS;
631699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                success = recordVideoFromSurface(
632699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                        frameRate, captureRate, 352, 288, codec,
633daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                        MediaRecorder.OutputFormat.THREE_GPP,
634ac95f1ac7764820b8deb58d4bdee4bda8b9654ebChong Zhang                        filename, false /* videoOnly */, null);
635daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                if (success) {
636daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                    success = validateVideo(filename, 352, 288);
637699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                    if (success) {
638699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                        success = validateMetadata(filename, captureRate);
639699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang                    }
640daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                }
641daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                if (!success) {
642daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                    noOfFailure++;
643daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                }
644daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            }
645daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        } catch (Exception e) {
646daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            Log.v(TAG, e.toString());
647699780f54b7ddd7b00f891218140df663b3ab84eChong Zhang            noOfFailure++;
648daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        }
649daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        assertTrue("testSurfaceRecordingTimeLapse", noOfFailure == 0);
650daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    }
651daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
653