Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(429)

Unified Diff: content/test/data/media/getusermedia_and_stop.html

Issue 13496009: Hookup the MediaStream glue for Adding and Removing tracks to an existing MediaStream. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/test/data/media/getusermedia_and_stop.html
diff --git a/content/test/data/media/getusermedia_and_stop.html b/content/test/data/media/getusermedia_and_stop.html
index f1c43bef012ea30a1bfd607e34e4b080ea8b2e17..ba562f11b7210d5699a9a3d60ca11acb0d44564c 100644
--- a/content/test/data/media/getusermedia_and_stop.html
+++ b/content/test/data/media/getusermedia_and_stop.html
@@ -1,6 +1,30 @@
<html>
<head>
<script type="text/javascript">
+ $ = function(id) {
+ return document.getElementById(id);
+ };
+
+ // These must match with how the video and canvas tags are declared in html.
+ const VIDEO_TAG_WIDTH = 320;
+ const VIDEO_TAG_HEIGHT = 240;
+
+ // Number of test events to occur before the test pass. When the test pass,
+ // the document title change to OK.
+ var gNumberOfExpectedEvents = 0;
+
+ // Number of events that currently have occurred.
+ var gNumberOfEvents = 0;
+
+ var gLocalStream = null;
+
+ // This test that a MediaStream can be cloned and that the clone can
+ // be rendered.
phoglund_chromium 2013/04/09 13:16:28 Maybe getUserMediaAndClone is a better name here.
perkj_chrome 2013/04/11 10:12:41 Done.
+ function createCloneStream() {
+ navigator.webkitGetUserMedia({video: true, audio: true},
+ createAndRenderClone, failedCallback);
+ }
+
function getUserMedia(constraints) {
navigator.webkitGetUserMedia(constraints, okCallback, failedCallback);
}
@@ -10,9 +34,101 @@
}
phoglund_chromium 2013/04/09 13:16:28 Rename to displayAndWaitForVideo?
perkj_chrome 2013/04/11 10:12:41 Done.
function okCallback(stream) {
phoglund_chromium 2013/04/09 13:16:28 We are no longer testing the stop() method. Can yo
perkj_chrome 2013/04/11 10:12:41 Humm- I did not really want to change the behavior
- stream.stop();
- document.title = 'OK';
+ gLocalStream = stream;
+ waitForVideo('local-view');
phoglund_chromium 2013/04/09 13:16:28 So this wait function happens to be asynchronous,
perkj_chrome 2013/04/11 10:12:41 Done.
+ var localStreamUrl = webkitURL.createObjectURL(stream);
+ $('local-view').src = localStreamUrl;
+ }
+
+ function createAndRenderClone(stream) {
+ gLocalStream = stream;
+ waitForVideo('local-view');
+
+ var new_stream = new webkitMediaStream(stream.getAudioTracks());
+ expectEquals(new_stream.getAudioTracks().length, 1);
+ new_stream.addTrack(stream.getVideoTracks()[0]);
+ expectEquals(new_stream.getVideoTracks().length, 1);
+ new_stream.removeTrack(new_stream.getAudioTracks()[0]);
+ expectEquals(new_stream.getAudioTracks().length, 0);
+
+ var newStreamUrl = webkitURL.createObjectURL(new_stream);
+ $('local-view').src = newStreamUrl;
+ }
+
+
phoglund_chromium 2013/04/09 13:16:28 You should be able to extract all code 59-116 to a
perkj_chrome 2013/04/11 10:12:41 Done.
+ function detectVideoIn(videoElementName, callback) {
+ var width = VIDEO_TAG_WIDTH;
+ var height = VIDEO_TAG_HEIGHT;
+ var videoElement = $(videoElementName);
+ var canvas = $(videoElementName + '-canvas');
+ var waitVideo = setInterval(function() {
+ var context = canvas.getContext('2d');
+ context.drawImage(videoElement, 0, 0, width, height);
+ var pixels = context.getImageData(0, 0, width, height).data;
+
+ if (isVideoPlaying(pixels, width, height)) {
+ clearInterval(waitVideo);
+ callback();
+ }
+ }, 100);
+ }
+
+ function waitForVideo(videoElement) {
+ document.title = 'Waiting for video...';
+ addExpectedEvent();
+ detectVideoIn(videoElement, function () { eventOccured(); });
+ }
+
+ function addExpectedEvent() {
+ ++gNumberOfExpectedEvents;
+ }
+
+ function eventOccured() {
+ ++gNumberOfEvents;
+ if (gNumberOfEvents == gNumberOfExpectedEvents) {
+ gLocalStream.stop();
+ document.title = 'OK';
+ }
+ }
+
+ // This very basic video verification algorithm will be satisfied if any
+ // pixels are nonzero in a small sample area in the middle. It relies on the
+ // assumption that a video element with null source just presents zeroes.
+ function isVideoPlaying(pixels, width, height) {
+ // Sample somewhere near the middle of the image.
+ var middle = width * height / 2;
+ for (var i = 0; i < 20; i++) {
+ if (pixels[middle + i] > 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // This function matches |left| and |right| and throws an exception if the
+ // values don't match.
+ function expectEquals(left, right) {
+ if (left != right) {
+ var s = "expectEquals failed left: " + left + " right: " + right;
+ document.title = s;
+ throw s;
+ }
}
- </script>
+
+ </script>
</head>
+<body>
+ <table border="0">
+ <tr>
+ <td>Local Preview</td>
+ </tr>
+ <tr>
+ <td><video width="320" height="240" id="local-view"
+ autoplay="autoplay"></video></td>
+ <!-- Canvases are named after their corresponding video elements. -->
+ <td><canvas width="320" height="240" id="local-view-canvas"
+ style="display:none"></canvas></td>
+ </tr>
+ </table>
+</body>
</html>

Powered by Google App Engine
This is Rietveld 408576698