| Index: webrtc/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java
|
| diff --git a/webrtc/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java b/webrtc/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java
|
| index 8f2babc049a4e9e270947974790540cc82cdfc3f..b55b50b96a7a1006f980ef7ab4c19a9ca85c2881 100644
|
| --- a/webrtc/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java
|
| +++ b/webrtc/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java
|
| @@ -15,7 +15,13 @@ import static org.junit.Assert.assertFalse;
|
| import static org.junit.Assert.assertTrue;
|
| import static org.junit.Assert.fail;
|
|
|
| +import android.annotation.TargetApi;
|
| import android.content.Context;
|
| +import android.media.CamcorderProfile;
|
| +import android.media.MediaRecorder;
|
| +import android.os.Environment;
|
| +import java.io.File;
|
| +import java.io.IOException;
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| import java.util.concurrent.CountDownLatch;
|
| @@ -502,6 +508,95 @@ class CameraVideoCapturerTestFixtures {
|
| disposeVideoTrackWithRenderer(videoTrackWithRenderer);
|
| }
|
|
|
| + @TargetApi(21)
|
| + public void updateMediaRecorder(boolean useSurfaceCapture)
|
| + throws InterruptedException, IOException {
|
| + final CapturerInstance capturerInstance = createCapturer(false /* initialize */);
|
| + final VideoTrackWithRenderer videoTrackWithRenderer =
|
| + createVideoTrackWithRenderer(capturerInstance.capturer);
|
| + // Wait for the camera to start so we can add and remove MediaRecorder.
|
| + assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
|
| +
|
| + final String videoOutPath = Environment.getExternalStorageDirectory().getPath()
|
| + + "/chromium_tests_root/testmediarecorder.mp4";
|
| + File outputFile = new File(videoOutPath);
|
| +
|
| + // Create MediaRecorder object
|
| + MediaRecorder mediaRecorder = new MediaRecorder();
|
| + mediaRecorder.setVideoSource(
|
| + useSurfaceCapture ? MediaRecorder.VideoSource.SURFACE : MediaRecorder.VideoSource.CAMERA);
|
| + CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
|
| + profile.videoCodec = MediaRecorder.VideoEncoder.H264;
|
| + profile.videoBitRate = 2500000;
|
| + profile.videoFrameWidth = 640;
|
| + profile.videoFrameHeight = 480;
|
| + mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
|
| + mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
|
| + mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
|
| + mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
|
| + mediaRecorder.setVideoEncoder(profile.videoCodec);
|
| + mediaRecorder.setOutputFile(outputFile.getPath());
|
| + mediaRecorder.prepare();
|
| +
|
| + // Add MediaRecorder to camera pipeline.
|
| + final boolean[] addMediaRecorderSuccessful = new boolean[1];
|
| + final CountDownLatch addBarrier = new CountDownLatch(1);
|
| + CameraVideoCapturer.MediaRecorderHandler addMediaRecorderHandler =
|
| + new CameraVideoCapturer.MediaRecorderHandler() {
|
| + @Override
|
| + public void onMediaRecorderSuccess() {
|
| + addMediaRecorderSuccessful[0] = true;
|
| + addBarrier.countDown();
|
| + }
|
| + @Override
|
| + public void onMediaRecorderError(String errorDescription) {
|
| + addMediaRecorderSuccessful[0] = false;
|
| + addBarrier.countDown();
|
| + }
|
| + };
|
| + capturerInstance.capturer.addMediaRecorderToCamera(mediaRecorder, addMediaRecorderHandler);
|
| + // Wait until MediaRecoder has been added.
|
| + addBarrier.await();
|
| + // Check result.
|
| + assertTrue(addMediaRecorderSuccessful[0]);
|
| +
|
| + // Start MediaRecorder and wait for a few frames to capture.
|
| + mediaRecorder.start();
|
| + for (int i = 0; i < 5; i++) {
|
| + assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
|
| + }
|
| + mediaRecorder.stop();
|
| +
|
| + // Remove MediaRecorder from camera pipeline.
|
| + final boolean[] removeMediaRecorderSuccessful = new boolean[1];
|
| + final CountDownLatch removeBarrier = new CountDownLatch(1);
|
| + CameraVideoCapturer.MediaRecorderHandler removeMediaRecorderHandler =
|
| + new CameraVideoCapturer.MediaRecorderHandler() {
|
| + @Override
|
| + public void onMediaRecorderSuccess() {
|
| + removeMediaRecorderSuccessful[0] = true;
|
| + removeBarrier.countDown();
|
| + }
|
| + @Override
|
| + public void onMediaRecorderError(String errorDescription) {
|
| + removeMediaRecorderSuccessful[0] = false;
|
| + removeBarrier.countDown();
|
| + }
|
| + };
|
| + capturerInstance.capturer.removeMediaRecorderFromCamera(removeMediaRecorderHandler);
|
| + // Wait until MediaRecoder has been removed.
|
| + removeBarrier.await();
|
| + // Check result.
|
| + assertTrue(removeMediaRecorderSuccessful[0]);
|
| + // Ensure that frames are received after removing MediaRecorder.
|
| + assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
|
| + // Check that recorded file contains some data.
|
| + assertTrue(outputFile.length() > 0);
|
| +
|
| + disposeCapturer(capturerInstance);
|
| + disposeVideoTrackWithRenderer(videoTrackWithRenderer);
|
| + }
|
| +
|
| public void cameraEventsInvoked() throws InterruptedException {
|
| final CapturerInstance capturerInstance = createCapturer(true /* initialize */);
|
| startCapture(capturerInstance);
|
|
|