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