MediaRecorderTest.java revision db6028508c8eb31a0de1dcdfc410ddfe6df7c5ad
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.mediaframeworktest.functional.mediarecorder; 18 19import com.android.mediaframeworktest.MediaFrameworkTest; 20import com.android.mediaframeworktest.MediaNames; 21 22import java.io.*; 23 24import android.content.Context; 25import android.hardware.Camera; 26import android.media.MediaPlayer; 27import android.media.MediaRecorder; 28import android.media.EncoderCapabilities; 29import android.media.EncoderCapabilities.VideoEncoderCap; 30import android.media.EncoderCapabilities.AudioEncoderCap; 31import android.test.ActivityInstrumentationTestCase2; 32import android.util.Log; 33import android.view.SurfaceHolder; 34import android.view.SurfaceView; 35import com.android.mediaframeworktest.MediaProfileReader; 36 37import android.test.suitebuilder.annotation.LargeTest; 38import android.test.suitebuilder.annotation.Suppress; 39import java.util.List; 40 41 42/** 43 * Junit / Instrumentation test case for the media recorder api 44 */ 45public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 46 private String TAG = "MediaRecorderTest"; 47 private int mOutputDuration =0; 48 private int mOutputVideoWidth = 0; 49 private int mOutputVideoHeight= 0 ; 50 51 private SurfaceHolder mSurfaceHolder = null; 52 private MediaRecorder mRecorder; 53 54 private int MIN_VIDEO_FPS = 5; 55 56 Context mContext; 57 Camera mCamera; 58 59 public MediaRecorderTest() { 60 super("com.android.mediaframeworktest", MediaFrameworkTest.class); 61 62 } 63 64 protected void setUp() throws Exception { 65 getActivity(); 66 mRecorder = new MediaRecorder(); 67 super.setUp(); 68 } 69 70 private void recordVideo(int frameRate, int width, int height, 71 int videoFormat, int outFormat, String outFile, boolean videoOnly) { 72 Log.v(TAG,"startPreviewAndPrepareRecording"); 73 try { 74 if (!videoOnly) { 75 Log.v(TAG, "setAudioSource"); 76 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 77 } 78 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 79 mRecorder.setOutputFormat(outFormat); 80 Log.v(TAG, "output format " + outFormat); 81 mRecorder.setOutputFile(outFile); 82 mRecorder.setVideoFrameRate(frameRate); 83 mRecorder.setVideoSize(width, height); 84 Log.v(TAG, "setEncoder"); 85 mRecorder.setVideoEncoder(videoFormat); 86 if (!videoOnly) { 87 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 88 } 89 mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 90 Log.v(TAG, "setPreview"); 91 mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 92 Log.v(TAG, "prepare"); 93 mRecorder.prepare(); 94 Log.v(TAG, "start"); 95 mRecorder.start(); 96 Thread.sleep(MediaNames.RECORDED_TIME); 97 Log.v(TAG, "stop"); 98 mRecorder.stop(); 99 mRecorder.release(); 100 } catch (Exception e) { 101 Log.v("record video failed ", e.toString()); 102 mRecorder.release(); 103 } 104 } 105 106 private boolean recordVideoWithPara(VideoEncoderCap videoCap, AudioEncoderCap audioCap, boolean highQuality){ 107 boolean recordSuccess = false; 108 int videoEncoder = videoCap.mCodec; 109 int audioEncoder = audioCap.mCodec; 110 int videoWidth = highQuality? videoCap.mMaxFrameWidth: videoCap.mMinFrameWidth; 111 int videoHeight = highQuality? videoCap.mMaxFrameHeight: videoCap.mMinFrameHeight; 112 int videoFps = highQuality? videoCap.mMaxFrameRate: videoCap.mMinFrameRate; 113 int videoBitrate = highQuality? videoCap.mMaxBitRate: videoCap.mMinBitRate; 114 int audioBitrate = highQuality? audioCap.mMaxBitRate: audioCap.mMinBitRate; 115 int audioChannels = highQuality? audioCap.mMaxChannels: audioCap.mMinChannels ; 116 int audioSamplingRate = highQuality? audioCap.mMaxSampleRate: audioCap.mMinSampleRate; 117 118 if (videoFps < MIN_VIDEO_FPS) { 119 videoFps = MIN_VIDEO_FPS; 120 } 121 mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 122 String filename = ("/sdcard/" + videoEncoder + "_" + audioEncoder + "_" + highQuality + ".3gp"); 123 try { 124 Log.v(TAG, "video encoder : " + videoEncoder); 125 Log.v(TAG, "audio encoder : " + audioEncoder); 126 Log.v(TAG, "quality : " + (highQuality?"high": "low")); 127 Log.v(TAG, "encoder : " + MediaProfileReader.getVideoCodecName(videoEncoder)); 128 Log.v(TAG, "audio : " + MediaProfileReader.getAudioCodecName(audioEncoder)); 129 Log.v(TAG, "videoWidth : " + videoWidth); 130 Log.v(TAG, "videoHeight : " + videoHeight); 131 Log.v(TAG, "videoFPS : " + videoFps); 132 Log.v(TAG, "videobitrate : " + videoBitrate); 133 Log.v(TAG, "audioBitrate : " + audioBitrate); 134 Log.v(TAG, "audioChannel : " + audioChannels); 135 Log.v(TAG, "AudioSampleRate : " + audioSamplingRate); 136 137 MediaRecorder mMediaRecorder = new MediaRecorder(); 138 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 139 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 140 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 141 mMediaRecorder.setOutputFile(filename); 142 mMediaRecorder.setVideoFrameRate(videoFps); 143 mMediaRecorder.setVideoSize(videoWidth, videoHeight); 144 mMediaRecorder.setVideoEncodingBitRate(videoBitrate); 145 mMediaRecorder.setAudioEncodingBitRate(audioBitrate); 146 mMediaRecorder.setAudioChannels(audioChannels); 147 mMediaRecorder.setAudioSamplingRate(audioSamplingRate); 148 mMediaRecorder.setVideoEncoder(videoEncoder); 149 mMediaRecorder.setAudioEncoder(audioEncoder); 150 mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 151 mMediaRecorder.prepare(); 152 mMediaRecorder.start(); 153 Thread.sleep(MediaNames.RECORDED_TIME); 154 mMediaRecorder.stop(); 155 mMediaRecorder.release(); 156 recordSuccess = validateVideo(filename, videoWidth, videoHeight); 157 } catch (Exception e) { 158 Log.v(TAG, e.toString()); 159 return false; 160 } 161 return recordSuccess; 162 } 163 164 private boolean invalidRecordSetting(int frameRate, int width, int height, 165 int videoFormat, int outFormat, String outFile, boolean videoOnly) { 166 try { 167 if (!videoOnly) { 168 Log.v(TAG, "setAudioSource"); 169 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 170 } 171 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 172 mRecorder.setOutputFormat(outFormat); 173 Log.v(TAG, "output format " + outFormat); 174 mRecorder.setOutputFile(outFile); 175 mRecorder.setVideoFrameRate(frameRate); 176 mRecorder.setVideoSize(width, height); 177 Log.v(TAG, "setEncoder"); 178 mRecorder.setVideoEncoder(videoFormat); 179 if (!videoOnly) { 180 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 181 } 182 mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 183 Log.v(TAG, "setPreview"); 184 mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 185 Log.v(TAG, "prepare"); 186 mRecorder.prepare(); 187 Log.v(TAG, "start"); 188 mRecorder.start(); 189 Thread.sleep(MediaNames.RECORDED_TIME); 190 Log.v(TAG, "stop"); 191 mRecorder.stop(); 192 mRecorder.release(); 193 } catch (Exception e) { 194 Log.v("record video failed ", e.toString()); 195 mRecorder.release(); 196 Log.v(TAG, "reset and release"); 197 return true; 198 } 199 return false; 200 } 201 202 private void getOutputVideoProperty(String outputFilePath) { 203 MediaPlayer mediaPlayer = new MediaPlayer(); 204 try { 205 mediaPlayer.setDataSource(outputFilePath); 206 Log.v(TAG, "file Path = " + outputFilePath); 207 mediaPlayer.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder()); 208 Log.v(TAG, "before player prepare"); 209 mediaPlayer.prepare(); 210 Log.v(TAG, "before getduration"); 211 mOutputDuration = mediaPlayer.getDuration(); 212 Log.v(TAG, "get video dimension"); 213 Thread.sleep(1000); 214 mOutputVideoHeight = mediaPlayer.getVideoHeight(); 215 mOutputVideoWidth = mediaPlayer.getVideoWidth(); 216 mediaPlayer.release(); 217 } catch (Exception e) { 218 Log.v(TAG, e.toString()); 219 mediaPlayer.release(); 220 } 221 } 222 223 private boolean validateVideo(String filePath, int width, int height) { 224 boolean validVideo = false; 225 getOutputVideoProperty(filePath); 226 if (mOutputVideoWidth == width && mOutputVideoHeight == height && 227 mOutputDuration > MediaNames.VALID_VIDEO_DURATION ) { 228 validVideo = true; 229 } 230 Log.v(TAG, "width = " + mOutputVideoWidth + " height = " + mOutputVideoHeight + " Duration = " + mOutputDuration); 231 return validVideo; 232 } 233 234 @LargeTest 235 /* 236 * This test case set the camera in portrait mode. 237 * Verification: validate the video dimension and the duration. 238 */ 239 public void testPortraitH263() throws Exception { 240 boolean videoRecordedResult = false; 241 try { 242 mCamera = Camera.open(); 243 Camera.Parameters parameters = mCamera.getParameters(); 244 parameters.setPreviewSize(352, 288); 245 parameters.set("orientation", "portrait"); 246 mCamera.setParameters(parameters); 247 mCamera.unlock(); 248 mRecorder.setCamera(mCamera); 249 Thread.sleep(1000); 250 int codec = MediaRecorder.VideoEncoder.H263; 251 int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec); 252 recordVideo(frameRate, 352, 288, codec, 253 MediaRecorder.OutputFormat.THREE_GPP, 254 MediaNames.RECORDED_PORTRAIT_H263, true); 255 mCamera.lock(); 256 mCamera.release(); 257 videoRecordedResult = 258 validateVideo(MediaNames.RECORDED_PORTRAIT_H263, 352, 288); 259 } catch (Exception e) { 260 Log.v(TAG, e.toString()); 261 } 262 assertTrue("PortraitH263", videoRecordedResult); 263 } 264 265 @LargeTest 266 public void testInvalidVideoPath() throws Exception { 267 boolean isTestInvalidVideoPathSuccessful = false; 268 isTestInvalidVideoPathSuccessful = invalidRecordSetting(15, 176, 144, MediaRecorder.VideoEncoder.H263, 269 MediaRecorder.OutputFormat.THREE_GPP, MediaNames.INVALD_VIDEO_PATH, false); 270 assertTrue("Invalid outputFile Path", isTestInvalidVideoPathSuccessful); 271 } 272 273 @LargeTest 274 //test cases for the new codec 275 public void testDeviceSpecificCodec() throws Exception { 276 int noOfFailure = 0; 277 boolean recordSuccess = false; 278 String deviceType = MediaProfileReader.getDeviceType(); 279 Log.v(TAG, "deviceType = " + deviceType); 280 List<VideoEncoderCap> videoEncoders = MediaProfileReader.getVideoEncoders(); 281 List<AudioEncoderCap> audioEncoders = MediaProfileReader.getAudioEncoders(); 282 for (int k = 0; k < 2; k++) { 283 for (VideoEncoderCap videoEncoder: videoEncoders) { 284 for (AudioEncoderCap audioEncoder: audioEncoders) { 285 if (k == 0) { 286 recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, true); 287 } else { 288 recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, false); 289 } 290 if (!recordSuccess) { 291 Log.v(TAG, "testDeviceSpecificCodec failed"); 292 Log.v(TAG, "Encoder = " + videoEncoder.mCodec + "Audio Encoder = " + audioEncoder.mCodec); 293 noOfFailure++; 294 } 295 } 296 } 297 } 298 if (noOfFailure != 0) { 299 assertTrue("testDeviceSpecificCodec", false); 300 } 301 } 302} 303