Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 039cd7ff authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "MediaRecorderTest: test recording from persistent surface" into mnc-dev

parents 03359161 ac95f1ac
Loading
Loading
Loading
Loading
+55 −7
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.Typeface;
import android.hardware.Camera;
import android.hardware.Camera;
import android.media.MediaCodec;
import android.media.MediaMetadataRetriever;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.media.MediaRecorder;
@@ -225,10 +226,12 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFra


    private boolean recordVideoFromSurface(
    private boolean recordVideoFromSurface(
            int frameRate, int captureRate, int width, int height,
            int frameRate, int captureRate, int width, int height,
            int videoFormat, int outFormat, String outFile, boolean videoOnly) {
            int videoFormat, int outFormat, String outFile, boolean videoOnly,
            Surface persistentSurface) {
        Log.v(TAG,"recordVideoFromSurface");
        Log.v(TAG,"recordVideoFromSurface");
        MediaRecorder recorder = new MediaRecorder();
        MediaRecorder recorder = new MediaRecorder();
        int sleepTime = 33; // normal capture at 33ms / frame
        int sleepTime = 33; // normal capture at 33ms / frame
        Surface surface = null;
        try {
        try {
            if (!videoOnly) {
            if (!videoOnly) {
                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
@@ -246,8 +249,15 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFra
            if (!videoOnly) {
            if (!videoOnly) {
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            }
            }
            if (persistentSurface != null) {
                Log.v(TAG, "using persistent surface");
                surface = persistentSurface;
                recorder.usePersistentSurface(surface);
            }
            recorder.prepare();
            recorder.prepare();
            Surface surface = recorder.getSurface();
            if (persistentSurface == null) {
                surface = recorder.getSurface();
            }


            Paint paint = new Paint();
            Paint paint = new Paint();
            paint.setTextSize(16);
            paint.setTextSize(16);
@@ -283,11 +293,15 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFra


            Log.v(TAG, "stop");
            Log.v(TAG, "stop");
            recorder.stop();
            recorder.stop();
            recorder.release();
        } catch (Exception e) {
        } catch (Exception e) {
            Log.v("record video failed ", e.toString());
            Log.v(TAG, "record video failed: " + e.toString());
            recorder.release();
            return false;
            return false;
        } finally {
            recorder.release();
            // release surface if not using persistent surface
            if (persistentSurface == null && surface != null) {
                surface.release();
            }
        }
        }
        return true;
        return true;
    }
    }
@@ -550,7 +564,7 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFra


                success = recordVideoFromSurface(frameRate, 0, 352, 288, codec,
                success = recordVideoFromSurface(frameRate, 0, 352, 288, codec,
                        MediaRecorder.OutputFormat.THREE_GPP, filename,
                        MediaRecorder.OutputFormat.THREE_GPP, filename,
                        k == 0 ? true : false /* videoOnly */);
                        k == 0 ? true : false /* videoOnly */, null);
                if (success) {
                if (success) {
                    success = validateVideo(filename, 352, 288);
                    success = validateVideo(filename, 352, 288);
                }
                }
@@ -564,6 +578,40 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFra
        assertTrue("testSurfaceRecording", noOfFailure == 0);
        assertTrue("testSurfaceRecording", noOfFailure == 0);
    }
    }


    public void testPersistentSurfaceRecording() {
        boolean success = false;
        int noOfFailure = 0;
        Surface surface = null;
        try {
            int codec = MediaRecorder.VideoEncoder.H264;
            int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
            surface = MediaCodec.createPersistentInputSurface();
            for (int k = 0; k < 2; k++) {
                String filename = "/sdcard/surface_persistent" + k + ".3gp";

                Log.v(TAG, "test persistent surface - round " + k);
                success = recordVideoFromSurface(frameRate, 0, 352, 288, codec,
                        MediaRecorder.OutputFormat.THREE_GPP, filename,
                        true /* videoOnly */, surface);
                if (success) {
                    success = validateVideo(filename, 352, 288);
                }
                if (!success) {
                    noOfFailure++;
                }
            }
        } catch (Exception e) {
            Log.v(TAG, e.toString());
        } finally {
            if (surface != null) {
                Log.v(TAG, "releasing persistent surface");
                surface.release();
                surface = null;
            }
        }
        assertTrue("testPersistentSurfaceRecording", noOfFailure == 0);
    }

    // Test recording from surface source with/without audio
    // Test recording from surface source with/without audio
    public void testSurfaceRecordingTimeLapse() {
    public void testSurfaceRecordingTimeLapse() {
        boolean success = false;
        boolean success = false;
@@ -583,7 +631,7 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaFra
                success = recordVideoFromSurface(
                success = recordVideoFromSurface(
                        frameRate, captureRate, 352, 288, codec,
                        frameRate, captureRate, 352, 288, codec,
                        MediaRecorder.OutputFormat.THREE_GPP,
                        MediaRecorder.OutputFormat.THREE_GPP,
                        filename, false /* videoOnly */);
                        filename, false /* videoOnly */, null);
                if (success) {
                if (success) {
                    success = validateVideo(filename, 352, 288);
                    success = validateVideo(filename, 352, 288);
                    if (success) {
                    if (success) {