Chromium Code Reviews| 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..c78bf4e857c2c3c62949fcba80555cba0e96ace0 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,97 @@ class CameraVideoCapturerTestFixtures { | 
| disposeVideoTrackWithRenderer(videoTrackWithRenderer); | 
| } | 
| + @TargetApi(21) | 
| + public void updateMediaRecorder(boolean useSurfaceCapture) | 
| + throws InterruptedException, IOException { | 
| + Logging.d(TAG, "updateMediaRecorder!!!"); | 
| 
 
sakal
2017/04/26 07:34:11
Probably a debug comment, please remove
 
AlexG
2017/04/26 21:04:10
Done.
 
 | 
| + 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(); | 
| + if (useSurfaceCapture) { | 
| 
 
sakal
2017/04/26 07:34:11
nit: I would prefer a ternary operator here
 
AlexG
2017/04/26 21:04:10
Done.
 
 | 
| + mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); | 
| + } else { | 
| + mediaRecorder.setVideoSource(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); | 
| 
 
magjed_webrtc
2017/04/26 16:01:41
Can we make some check on outputFile?
 
AlexG
2017/04/26 21:04:10
Done.
 
 | 
| + | 
| + disposeCapturer(capturerInstance); | 
| + disposeVideoTrackWithRenderer(videoTrackWithRenderer); | 
| + } | 
| + | 
| public void cameraEventsInvoked() throws InterruptedException { | 
| final CapturerInstance capturerInstance = createCapturer(true /* initialize */); | 
| startCapture(capturerInstance); |