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