MediaRecorderTest.java revision daa98ca8d7c85b77ad794cc8d9f17e262ac41d96
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;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder;
321b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities;
331b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.VideoEncoderCap;
341b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.AudioEncoderCap;
3562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
37e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhangimport android.view.Surface;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceView;
401619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaProfileReader;
4199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaFrameworkTestRunner;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress;
451b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport java.util.List;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
49e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang * Junit / Instrumentation test case for the media recorder api
50e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang */
5162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupublic class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String TAG = "MediaRecorderTest";
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOutputDuration =0;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOutputVideoWidth = 0;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOutputVideoHeight= 0 ;
56e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mSurfaceHolder = null;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MediaRecorder mRecorder;
591619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
601619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    private int MIN_VIDEO_FPS = 5;
61daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    private int HIGH_SPEED_FPS = 120;
621619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
63e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau    private static final int CAMERA_ID = 0;
64e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
662071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    Camera mCamera;
67e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaRecorderTest() {
69e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        super(MediaFrameworkTest.class);
70e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
7462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        getActivity();
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRecorder = new MediaRecorder();
7662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        super.setUp();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
79e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    private void recordVideo(int frameRate, int width, int height,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int videoFormat, int outFormat, String outFile, boolean videoOnly) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG,"startPreviewAndPrepareRecording");
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setAudioSource");
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFormat(outFormat);
89e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "output format " + outFormat);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFile(outFile);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoFrameRate(frameRate);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSize(width, height);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setEncoder");
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoEncoder(videoFormat);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setPreview");
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "prepare");
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.prepare();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "start");
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.start();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(MediaNames.RECORDED_TIME);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "stop");
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.stop();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("record video failed ", e.toString());
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
114e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
115e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    private boolean validateGetSurface(boolean useSurface) {
116e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        Log.v(TAG,"validateGetSurface, useSurface=" + useSurface);
117e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        MediaRecorder recorder = new MediaRecorder();
118e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        Surface surface;
119e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        boolean success = true;
120e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
121e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* initialization */
122e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (!useSurface) {
123e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera = Camera.open(CAMERA_ID);
124e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                Camera.Parameters parameters = mCamera.getParameters();
125e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                parameters.setPreviewSize(352, 288);
126e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                parameters.set("orientation", "portrait");
127e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.setParameters(parameters);
128e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.unlock();
129e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setCamera(mCamera);
130e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
131e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setPreviewDisplay(mSurfaceHolder.getSurface());
132e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
133e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
134e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
135e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int videoSource = useSurface ?
136e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    MediaRecorder.VideoSource.SURFACE :
137e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    MediaRecorder.VideoSource.CAMERA;
138e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSource(videoSource);
139e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
140e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFile(MediaNames.RECORDED_SURFACE_3GP);
141e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoFrameRate(30);
142e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSize(352, 288);
143e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
144e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
145e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
146e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() before prepare()
147e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should throw IllegalStateException
148e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
149e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
150e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
151e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                throw new Exception("getSurface failed to throw IllegalStateException");
152e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
153e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // OK
154e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
155e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
156e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.prepare();
157e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
158e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() after prepare()
159e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should succeed for surface source
160e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should fail for camera source
161e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
162e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
163e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
164e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!useSurface) {
165e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
166e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
167e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
168e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (useSurface) {
169e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
170e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
171e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
172e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
173e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.start();
174e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
175e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() after start()
176e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should succeed for surface source
177e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should fail for camera source
178e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
179e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
180e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
181e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!useSurface) {
182e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
183e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
184e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
185e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (useSurface) {
186e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    throw new Exception("getSurface failed to throw IllegalStateException");
187e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
188e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
189e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
190e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
191e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.stop();
192e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (Exception e) {
193e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // stop() could fail if the recording is empty, as we didn't render anything.
194e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // ignore any failure in stop, we just want it stopped.
195e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
196e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
197e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: getSurface() after stop()
198e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * should throw IllegalStateException
199e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
200e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            try {
201e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface = recorder.getSurface();
202e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                throw new Exception("getSurface failed to throw IllegalStateException");
203e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            } catch (IllegalStateException e) {
204e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                // OK
205e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
206e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
207e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            // fail
208e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            success = false;
209e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
210e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
211e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
212e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (mCamera != null) {
213e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.lock();
214e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera.release();
215e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                mCamera = null;
216e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
217e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.release();
218e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
219e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            success = false;
220e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
221e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
222e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        return success;
223e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
224e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
225daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    private boolean recordVideoFromSurface(
226daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            int frameRate, int captureRate, int width, int height,
227e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int videoFormat, int outFormat, String outFile, boolean videoOnly) {
228e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        Log.v(TAG,"recordVideoFromSurface");
229e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        MediaRecorder recorder = new MediaRecorder();
230daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        int sleepTime = 33; // normal capture at 33ms / frame
231e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
232e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (!videoOnly) {
233e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
234e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
235e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
236e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFormat(outFormat);
237e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setOutputFile(outFile);
238e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoFrameRate(frameRate);
239daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            if (captureRate > 0) {
240daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                recorder.setCaptureRate(captureRate);
241daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                sleepTime = 1000 / captureRate;
242daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            }
243e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoSize(width, height);
244e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.setVideoEncoder(videoFormat);
245e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            if (!videoOnly) {
246e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
247e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
248e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.prepare();
249e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Surface surface = recorder.getSurface();
250e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
251e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Paint paint = new Paint();
252e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            paint.setTextSize(16);
253e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            paint.setColor(Color.RED);
254e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int i;
255e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
256e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: draw 10 frames at 30fps before start
257e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             * these should be dropped and not causing malformed stream.
258e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang             */
259e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for(i = 0; i < 10; i++) {
260e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                Canvas canvas = surface.lockCanvas(null);
261e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                int background = (i * 255 / 99);
262e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawARGB(255, background, background, background);
263e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                String text = "Frame #" + i;
264e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawText(text, 100, 100, paint);
265e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface.unlockCanvasAndPost(canvas);
266daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                Thread.sleep(sleepTime);
267e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
268e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
269e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "start");
270e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.start();
271e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
272e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            /* Test: draw another 90 frames at 30fps after start */
273e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for(i = 10; i < 100; i++) {
274e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                Canvas canvas = surface.lockCanvas(null);
275e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                int background = (i * 255 / 99);
276e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawARGB(255, background, background, background);
277e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                String text = "Frame #" + i;
278e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                canvas.drawText(text, 100, 100, paint);
279e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                surface.unlockCanvasAndPost(canvas);
280daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                Thread.sleep(sleepTime);
281e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
282e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
283e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "stop");
284e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.stop();
285e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.release();
286e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
287e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v("record video failed ", e.toString());
288e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            recorder.release();
289e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            return false;
290e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
291e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        return true;
292e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
293e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
2941b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private boolean recordVideoWithPara(VideoEncoderCap videoCap, AudioEncoderCap audioCap, boolean highQuality){
2951619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        boolean recordSuccess = false;
2961b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoEncoder = videoCap.mCodec;
2971b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioEncoder = audioCap.mCodec;
2981b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoWidth = highQuality? videoCap.mMaxFrameWidth: videoCap.mMinFrameWidth;
2991b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoHeight = highQuality? videoCap.mMaxFrameHeight: videoCap.mMinFrameHeight;
3001b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoFps = highQuality? videoCap.mMaxFrameRate: videoCap.mMinFrameRate;
3011b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int videoBitrate = highQuality? videoCap.mMaxBitRate: videoCap.mMinBitRate;
3021b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioBitrate = highQuality? audioCap.mMaxBitRate: audioCap.mMinBitRate;
3031b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioChannels = highQuality? audioCap.mMaxChannels: audioCap.mMinChannels ;
3041b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        int audioSamplingRate = highQuality? audioCap.mMaxSampleRate: audioCap.mMinSampleRate;
3051619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
30699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        //Overide the fps if the min_camera_fps is set
30799b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        if (MediaFrameworkTestRunner.mMinCameraFps != 0 &&
30899b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            MediaFrameworkTestRunner.mMinCameraFps > videoFps){
30999b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau            videoFps = MediaFrameworkTestRunner.mMinCameraFps;
31099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau        }
31199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
3121619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        if (videoFps < MIN_VIDEO_FPS) {
3131619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            videoFps = MIN_VIDEO_FPS;
3141619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        }
31599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau
3161619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
3171b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        String filename = ("/sdcard/" + videoEncoder + "_" + audioEncoder + "_" + highQuality + ".3gp");
3181619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        try {
319620a4240366f13c3359c6825c92e831563cc11b6James Dong            Log.v(TAG, "video encoder : " + videoEncoder);
320620a4240366f13c3359c6825c92e831563cc11b6James Dong            Log.v(TAG, "audio encoder : " + audioEncoder);
3211b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            Log.v(TAG, "quality : " + (highQuality?"high": "low"));
3221b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            Log.v(TAG, "encoder : " + MediaProfileReader.getVideoCodecName(videoEncoder));
3231b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            Log.v(TAG, "audio : " + MediaProfileReader.getAudioCodecName(audioEncoder));
3241619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videoWidth : " + videoWidth);
3251619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videoHeight : " + videoHeight);
3261619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videoFPS : " + videoFps);
3271619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "videobitrate : " + videoBitrate);
3281619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "audioBitrate : " + audioBitrate);
3291619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "audioChannel : " + audioChannels);
3301619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, "AudioSampleRate : " + audioSamplingRate);
3311619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
3321619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            MediaRecorder mMediaRecorder = new MediaRecorder();
3331619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
3341619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
3351619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
3361619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setOutputFile(filename);
3371619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoFrameRate(videoFps);
3381619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoSize(videoWidth, videoHeight);
3390fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setVideoEncodingBitRate(videoBitrate);
3400fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setAudioEncodingBitRate(audioBitrate);
3410fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setAudioChannels(audioChannels);
3420fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            mMediaRecorder.setAudioSamplingRate(audioSamplingRate);
3431619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setVideoEncoder(videoEncoder);
3441619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setAudioEncoder(audioEncoder);
3451619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
3461619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.prepare();
3471619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.start();
3481619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Thread.sleep(MediaNames.RECORDED_TIME);
3491619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.stop();
3501619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            mMediaRecorder.release();
3511619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            recordSuccess = validateVideo(filename, videoWidth, videoHeight);
3521619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        } catch (Exception e) {
3531619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            Log.v(TAG, e.toString());
3541619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            return false;
3551619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        }
3561619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        return recordSuccess;
3571619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
3581619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
359e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    private boolean invalidRecordSetting(int frameRate, int width, int height,
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int videoFormat, int outFormat, String outFile, boolean videoOnly) {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "setAudioSource");
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFormat(outFormat);
368e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, "output format " + outFormat);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setOutputFile(outFile);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoFrameRate(frameRate);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoSize(width, height);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setEncoder");
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setVideoEncoder(videoFormat);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!videoOnly) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "setPreview");
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "prepare");
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.prepare();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "start");
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.start();
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(MediaNames.RECORDED_TIME);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "stop");
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.stop();
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("record video failed ", e.toString());
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecorder.release();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "reset and release");
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
396e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void getOutputVideoProperty(String outputFilePath) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaPlayer mediaPlayer = new MediaPlayer();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.setDataSource(outputFilePath);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "file Path = " + outputFilePath);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "before player prepare");
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.prepare();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "before getduration");
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOutputDuration = mediaPlayer.getDuration();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "get video dimension");
40817d7ea4947dfad101ae689f3b717ba0a52945155Yu Shan Emily Lau            Thread.sleep(1000);
409bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau            mOutputVideoHeight = mediaPlayer.getVideoHeight();
410bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau            mOutputVideoWidth = mediaPlayer.getVideoWidth();
411e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            mediaPlayer.release();
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, e.toString());
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mediaPlayer.release();
415e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
417e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean validateVideo(String filePath, int width, int height) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean validVideo = false;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getOutputVideoProperty(filePath);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOutputVideoWidth == width && mOutputVideoHeight == height &&
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOutputDuration > MediaNames.VALID_VIDEO_DURATION ) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            validVideo = true;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "width = " + mOutputVideoWidth + " height = " + mOutputVideoHeight + " Duration = " + mOutputDuration);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return validVideo;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
4292071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    @LargeTest
4302071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    /*
4312071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau     * This test case set the camera in portrait mode.
4322071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau     * Verification: validate the video dimension and the duration.
4332071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau     */
4342071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau    public void testPortraitH263() throws Exception {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean videoRecordedResult = false;
4362071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau        try {
437e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau            mCamera = Camera.open(CAMERA_ID);
4382071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            Camera.Parameters parameters = mCamera.getParameters();
4392071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            parameters.setPreviewSize(352, 288);
4402071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            parameters.set("orientation", "portrait");
4412071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.setParameters(parameters);
4422071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.unlock();
4432071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mRecorder.setCamera(mCamera);
4442071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            Thread.sleep(1000);
445b05a600352dcd4517c62c7503edf9eea22359280James Dong            int codec = MediaRecorder.VideoEncoder.H263;
446b05a600352dcd4517c62c7503edf9eea22359280James Dong            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
447b05a600352dcd4517c62c7503edf9eea22359280James Dong            recordVideo(frameRate, 352, 288, codec,
448e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    MediaRecorder.OutputFormat.THREE_GPP,
4492071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau                    MediaNames.RECORDED_PORTRAIT_H263, true);
4502071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.lock();
4512071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            mCamera.release();
452bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau            videoRecordedResult =
453bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau                validateVideo(MediaNames.RECORDED_PORTRAIT_H263, 352, 288);
4542071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau        } catch (Exception e) {
4552071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau            Log.v(TAG, e.toString());
4562071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau        }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("PortraitH263", videoRecordedResult);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
459e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
461e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    public void testInvalidVideoPath() throws Exception {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isTestInvalidVideoPathSuccessful = false;
463e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        isTestInvalidVideoPathSuccessful = invalidRecordSetting(15, 176, 144, MediaRecorder.VideoEncoder.H263,
464e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang               MediaRecorder.OutputFormat.THREE_GPP, MediaNames.INVALD_VIDEO_PATH, false);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Invalid outputFile Path", isTestInvalidVideoPathSuccessful);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
467e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
4681619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    @LargeTest
469dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau    //test cases for the new codec
4701619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    public void testDeviceSpecificCodec() throws Exception {
471dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau        int noOfFailure = 0;
4721619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        boolean recordSuccess = false;
4731619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        String deviceType = MediaProfileReader.getDeviceType();
4741619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        Log.v(TAG, "deviceType = " + deviceType);
4751b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        List<VideoEncoderCap> videoEncoders = MediaProfileReader.getVideoEncoders();
4761b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        List<AudioEncoderCap> audioEncoders = MediaProfileReader.getAudioEncoders();
4771b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        for (int k = 0; k < 2; k++) {
4781b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            for (VideoEncoderCap videoEncoder: videoEncoders) {
4791b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                for (AudioEncoderCap audioEncoder: audioEncoders) {
4801b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    if (k == 0) {
4811b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, true);
4821b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    } else {
4831b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, false);
4841b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    }
4851b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                    if (!recordSuccess) {
4861b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        Log.v(TAG, "testDeviceSpecificCodec failed");
4871b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        Log.v(TAG, "Encoder = " + videoEncoder.mCodec + "Audio Encoder = " + audioEncoder.mCodec);
4881b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                        noOfFailure++;
4891619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau                    }
4901619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau                }
4911619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau            }
4921b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        }
4931b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        if (noOfFailure != 0) {
4941b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            assertTrue("testDeviceSpecificCodec", false);
495dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau        }
4961619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
497e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
498e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    // Test MediaRecorder.getSurface() api with surface or camera source
499e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    public void testGetSurfaceApi() {
500e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        boolean success = false;
501e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        int noOfFailure = 0;
502e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
503e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for (int k = 0; k < 2; k++) {
504e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                success = validateGetSurface(
505e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                        k == 0 ? true : false /* useSurface */);
506e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!success) {
507e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    noOfFailure++;
508e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
509e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
510e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
511e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, e.toString());
512e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
513e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        assertTrue("testGetSurfaceApi", noOfFailure == 0);
514e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
515e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
516e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    // Test recording from surface source with/without audio
517e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    public void testSurfaceRecording() {
518e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        boolean success = false;
519e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        int noOfFailure = 0;
520e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        try {
521e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int codec = MediaRecorder.VideoEncoder.H264;
522e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
523e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            for (int k = 0; k < 2; k++) {
524e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                String filename = "/sdcard/surface_" +
525e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                            (k==0?"video_only":"with_audio") + ".3gp";
526e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang
527daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                success = recordVideoFromSurface(frameRate, 0, 352, 288, codec,
528e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                        MediaRecorder.OutputFormat.THREE_GPP, filename,
529e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                        k == 0 ? true : false /* videoOnly */);
530e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (success) {
531e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    success = validateVideo(filename, 352, 288);
532e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
533e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                if (!success) {
534e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                    noOfFailure++;
535e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang                }
536e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            }
537e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        } catch (Exception e) {
538e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            Log.v(TAG, e.toString());
539e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        }
540e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        assertTrue("testSurfaceRecording", noOfFailure == 0);
541e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang    }
542daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang
543daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    // Test recording from surface source with/without audio
544daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    public void testSurfaceRecordingTimeLapse() {
545daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        boolean success = false;
546daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        int noOfFailure = 0;
547daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        try {
548daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            int codec = MediaRecorder.VideoEncoder.H264;
549daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
550daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            for (int k = 0; k < 2; k++) {
551daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // k==0: time lapse test, set capture rate to MIN_VIDEO_FPS
552daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // k==1: slow motion test, set capture rate to HIGH_SPEED_FPS
553daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                String filename = "/sdcard/surface_" +
554daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                            (k==0 ? "time_lapse" : "slow_motion") + ".3gp";
555daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang
556daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // always set videoOnly=false, MediaRecorder should disable
557daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                // audio automatically with time lapse/slow motion
558daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                success = recordVideoFromSurface(frameRate,
559daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                        k==0 ? MIN_VIDEO_FPS : HIGH_SPEED_FPS,
560daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                        352, 288, codec,
561daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                        MediaRecorder.OutputFormat.THREE_GPP,
562daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                        filename, false /* videoOnly */);
563daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                if (success) {
564daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                    success = validateVideo(filename, 352, 288);
565daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                }
566daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                if (!success) {
567daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                    noOfFailure++;
568daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang                }
569daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            }
570daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        } catch (Exception e) {
571daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang            Log.v(TAG, e.toString());
572daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        }
573daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang        assertTrue("testSurfaceRecordingTimeLapse", noOfFailure == 0);
574daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang    }
575daa98ca8d7c85b77ad794cc8d9f17e262ac41d96Chong Zhang
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
577