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; 252071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lauimport android.hardware.Camera; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaPlayer; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaRecorder; 281b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities; 291b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.VideoEncoderCap; 301b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.AudioEncoderCap; 3162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceView; 351619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaProfileReader; 3699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaFrameworkTestRunner; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress; 401b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport java.util.List; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Junit / Instrumentation test case for the media recorder api 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupublic class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String TAG = "MediaRecorderTest"; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mOutputDuration =0; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mOutputVideoWidth = 0; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mOutputVideoHeight= 0 ; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SurfaceHolder mSurfaceHolder = null; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MediaRecorder mRecorder; 541619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau 551619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau private int MIN_VIDEO_FPS = 5; 561619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau 57e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau private static final int CAMERA_ID = 0; 58e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context mContext; 602071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau Camera mCamera; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MediaRecorderTest() { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("com.android.mediaframeworktest", MediaFrameworkTest.class); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setUp() throws Exception { 6862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau getActivity(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder = new MediaRecorder(); 7062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau super.setUp(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void recordVideo(int frameRate, int width, int height, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int videoFormat, int outFormat, String outFile, boolean videoOnly) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG,"startPreviewAndPrepareRecording"); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!videoOnly) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setAudioSource"); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFormat(outFormat); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "output format " + outFormat); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(outFile); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoFrameRate(frameRate); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(width, height); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setEncoder"); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(videoFormat); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!videoOnly) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setPreview"); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "prepare"); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start"); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.start(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(MediaNames.RECORDED_TIME); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop"); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.stop(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v("record video failed ", e.toString()); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1091b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong private boolean recordVideoWithPara(VideoEncoderCap videoCap, AudioEncoderCap audioCap, boolean highQuality){ 1101619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau boolean recordSuccess = false; 1111b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int videoEncoder = videoCap.mCodec; 1121b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int audioEncoder = audioCap.mCodec; 1131b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int videoWidth = highQuality? videoCap.mMaxFrameWidth: videoCap.mMinFrameWidth; 1141b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int videoHeight = highQuality? videoCap.mMaxFrameHeight: videoCap.mMinFrameHeight; 1151b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int videoFps = highQuality? videoCap.mMaxFrameRate: videoCap.mMinFrameRate; 1161b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int videoBitrate = highQuality? videoCap.mMaxBitRate: videoCap.mMinBitRate; 1171b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int audioBitrate = highQuality? audioCap.mMaxBitRate: audioCap.mMinBitRate; 1181b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int audioChannels = highQuality? audioCap.mMaxChannels: audioCap.mMinChannels ; 1191b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong int audioSamplingRate = highQuality? audioCap.mMaxSampleRate: audioCap.mMinSampleRate; 1201619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau 12199b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau //Overide the fps if the min_camera_fps is set 12299b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau if (MediaFrameworkTestRunner.mMinCameraFps != 0 && 12399b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau MediaFrameworkTestRunner.mMinCameraFps > videoFps){ 12499b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau videoFps = MediaFrameworkTestRunner.mMinCameraFps; 12599b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau } 12699b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau 1271619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau if (videoFps < MIN_VIDEO_FPS) { 1281619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau videoFps = MIN_VIDEO_FPS; 1291619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 13099b4523b753f35122e23e90c95f57399c3f8bb10Yu Shan Emily Lau 1311619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 1321b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong String filename = ("/sdcard/" + videoEncoder + "_" + audioEncoder + "_" + highQuality + ".3gp"); 1331619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau try { 134620a4240366f13c3359c6825c92e831563cc11b6James Dong Log.v(TAG, "video encoder : " + videoEncoder); 135620a4240366f13c3359c6825c92e831563cc11b6James Dong Log.v(TAG, "audio encoder : " + audioEncoder); 1361b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong Log.v(TAG, "quality : " + (highQuality?"high": "low")); 1371b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong Log.v(TAG, "encoder : " + MediaProfileReader.getVideoCodecName(videoEncoder)); 1381b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong Log.v(TAG, "audio : " + MediaProfileReader.getAudioCodecName(audioEncoder)); 1391619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "videoWidth : " + videoWidth); 1401619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "videoHeight : " + videoHeight); 1411619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "videoFPS : " + videoFps); 1421619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "videobitrate : " + videoBitrate); 1431619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "audioBitrate : " + audioBitrate); 1441619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "audioChannel : " + audioChannels); 1451619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "AudioSampleRate : " + audioSamplingRate); 1461619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau 1471619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau MediaRecorder mMediaRecorder = new MediaRecorder(); 1481619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 1491619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 1501619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 1511619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setOutputFile(filename); 1521619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setVideoFrameRate(videoFps); 1531619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setVideoSize(videoWidth, videoHeight); 1540fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong mMediaRecorder.setVideoEncodingBitRate(videoBitrate); 1550fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong mMediaRecorder.setAudioEncodingBitRate(audioBitrate); 1560fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong mMediaRecorder.setAudioChannels(audioChannels); 1570fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong mMediaRecorder.setAudioSamplingRate(audioSamplingRate); 1581619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setVideoEncoder(videoEncoder); 1591619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setAudioEncoder(audioEncoder); 1601619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 1611619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.prepare(); 1621619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.start(); 1631619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Thread.sleep(MediaNames.RECORDED_TIME); 1641619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.stop(); 1651619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau mMediaRecorder.release(); 1661619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau recordSuccess = validateVideo(filename, videoWidth, videoHeight); 1671619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } catch (Exception e) { 1681619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, e.toString()); 1691619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau return false; 1701619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 1711619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau return recordSuccess; 1721619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 1731619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean invalidRecordSetting(int frameRate, int width, int height, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int videoFormat, int outFormat, String outFile, boolean videoOnly) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!videoOnly) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setAudioSource"); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFormat(outFormat); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "output format " + outFormat); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setOutputFile(outFile); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoFrameRate(frameRate); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoSize(width, height); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setEncoder"); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setVideoEncoder(videoFormat); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!videoOnly) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "setPreview"); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "prepare"); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.prepare(); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start"); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.start(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(MediaNames.RECORDED_TIME); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop"); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.stop(); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v("record video failed ", e.toString()); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecorder.release(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "reset and release"); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void getOutputVideoProperty(String outputFilePath) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaPlayer mediaPlayer = new MediaPlayer(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaPlayer.setDataSource(outputFilePath); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "file Path = " + outputFilePath); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaPlayer.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder()); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "before player prepare"); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaPlayer.prepare(); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "before getduration"); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOutputDuration = mediaPlayer.getDuration(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "get video dimension"); 22317d7ea4947dfad101ae689f3b717ba0a52945155Yu Shan Emily Lau Thread.sleep(1000); 224bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau mOutputVideoHeight = mediaPlayer.getVideoHeight(); 225bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau mOutputVideoWidth = mediaPlayer.getVideoWidth(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaPlayer.release(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, e.toString()); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mediaPlayer.release(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean validateVideo(String filePath, int width, int height) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validVideo = false; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOutputVideoProperty(filePath); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOutputVideoWidth == width && mOutputVideoHeight == height && 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOutputDuration > MediaNames.VALID_VIDEO_DURATION ) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validVideo = true; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "width = " + mOutputVideoWidth + " height = " + mOutputVideoHeight + " Duration = " + mOutputDuration); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return validVideo; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau 2442071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau @LargeTest 2452071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau /* 2462071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau * This test case set the camera in portrait mode. 2472071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau * Verification: validate the video dimension and the duration. 2482071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau */ 2492071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau public void testPortraitH263() throws Exception { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean videoRecordedResult = false; 2512071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau try { 252e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau mCamera = Camera.open(CAMERA_ID); 2532071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau Camera.Parameters parameters = mCamera.getParameters(); 2542071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau parameters.setPreviewSize(352, 288); 2552071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau parameters.set("orientation", "portrait"); 2562071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau mCamera.setParameters(parameters); 2572071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau mCamera.unlock(); 2582071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau mRecorder.setCamera(mCamera); 2592071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau Thread.sleep(1000); 260b05a600352dcd4517c62c7503edf9eea22359280James Dong int codec = MediaRecorder.VideoEncoder.H263; 261b05a600352dcd4517c62c7503edf9eea22359280James Dong int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec); 262b05a600352dcd4517c62c7503edf9eea22359280James Dong recordVideo(frameRate, 352, 288, codec, 2632071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau MediaRecorder.OutputFormat.THREE_GPP, 2642071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau MediaNames.RECORDED_PORTRAIT_H263, true); 2652071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau mCamera.lock(); 2662071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau mCamera.release(); 267bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau videoRecordedResult = 268bc95d663adf047116d0286b4a797e60ae2410fecYu Shan Emily Lau validateVideo(MediaNames.RECORDED_PORTRAIT_H263, 352, 288); 2692071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau } catch (Exception e) { 2702071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau Log.v(TAG, e.toString()); 2712071043512fc9ceba5d06fe6ea23eeda499c8e02Yu Shan Emily Lau } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertTrue("PortraitH263", videoRecordedResult); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testInvalidVideoPath() throws Exception { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isTestInvalidVideoPathSuccessful = false; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isTestInvalidVideoPathSuccessful = invalidRecordSetting(15, 176, 144, MediaRecorder.VideoEncoder.H263, 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaRecorder.OutputFormat.THREE_GPP, MediaNames.INVALD_VIDEO_PATH, false); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertTrue("Invalid outputFile Path", isTestInvalidVideoPathSuccessful); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2831619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau @LargeTest 284dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau //test cases for the new codec 2851619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau public void testDeviceSpecificCodec() throws Exception { 286dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau int noOfFailure = 0; 2871619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau boolean recordSuccess = false; 2881619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau String deviceType = MediaProfileReader.getDeviceType(); 2891619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau Log.v(TAG, "deviceType = " + deviceType); 2901b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong List<VideoEncoderCap> videoEncoders = MediaProfileReader.getVideoEncoders(); 2911b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong List<AudioEncoderCap> audioEncoders = MediaProfileReader.getAudioEncoders(); 2921b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong for (int k = 0; k < 2; k++) { 2931b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong for (VideoEncoderCap videoEncoder: videoEncoders) { 2941b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong for (AudioEncoderCap audioEncoder: audioEncoders) { 2951b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong if (k == 0) { 2961b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, true); 2971b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong } else { 2981b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong recordSuccess = recordVideoWithPara(videoEncoder, audioEncoder, false); 2991b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong } 3001b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong if (!recordSuccess) { 3011b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong Log.v(TAG, "testDeviceSpecificCodec failed"); 3021b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong Log.v(TAG, "Encoder = " + videoEncoder.mCodec + "Audio Encoder = " + audioEncoder.mCodec); 3031b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong noOfFailure++; 3041619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 3051619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 3061619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 3071b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong } 3081b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong if (noOfFailure != 0) { 3091b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong assertTrue("testDeviceSpecificCodec", false); 310dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau } 3111619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 313