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