Index: content/test/data/media/getusermedia.html |
diff --git a/content/test/data/media/getusermedia.html b/content/test/data/media/getusermedia.html |
index 7481613291288c2a410d50ad87e206be27bfc33c..163a7aad6a7aab864f18ecfe27302fe324eb9ee4 100644 |
--- a/content/test/data/media/getusermedia.html |
+++ b/content/test/data/media/getusermedia.html |
@@ -10,15 +10,9 @@ |
setAllEventsOccuredHandler(function() { |
gLocalStream.stop(); |
- document.title = 'OK'; |
- sendValueToTest(document.title); |
+ reportTestSuccess(); |
}); |
- function sendValueToTest(value) { |
- window.domAutomationController.setAutomationId(0); |
- window.domAutomationController.send(value); |
- } |
- |
function getSources() { |
MediaStreamTrack.getSources(function(devices) { |
document.title = 'Sources Available'; |
@@ -29,30 +23,42 @@ |
// Creates a MediaStream and renders it locally. When the video is detected to |
// be rolling, the title is changed and the stream should be stopped. |
function getUserMediaAndStop(constraints) { |
- document.title = 'Calling GetUserMedia'; |
+ console.log('Calling getUserMediaAndStop.'); |
navigator.webkitGetUserMedia( |
constraints, |
function(stream) { displayAndDetectVideo(stream, stopVideoTrack); }, |
failedCallback); |
} |
+ // Requests getusermedia and expects it to fail. |
+ function getUserMediaAndExpectFailure(constraints) { |
+ console.log('Calling getUserMediaAndExpectFailure.'); |
+ navigator.webkitGetUserMedia( |
+ constraints, |
+ function(stream) { failTest('Unexpectedly succeeded getUserMedia.'); }, |
+ function(error) { reportTestSuccess(); }); |
+ } |
+ |
// Creates a MediaStream and renders it locally. When the video is detected to |
- // be rolling, the title should be changed and the stream is let roll for a |
- // number |waitTimeInSeconds| and then it should be stopped. |
- function getUserMediaAndWaitAndStop(constraints, waitTimeInSeconds) { |
+ // be rolling we return ok-stream-running through the automation controller. |
+ function getUserMediaAndGetStreamUp(constraints, waitTimeInSeconds) { |
+ console.log('Calling getUserMediaAndGetStreamUp.'); |
navigator.webkitGetUserMedia( |
constraints, |
function(stream) { |
displayAndDetectVideo( |
stream, |
function() { |
- waitAndStopVideoTrack(waitTimeInSeconds); |
+ sendValueToTest('ok-stream-running'); |
}); |
}, |
failedCallback); |
} |
+ // Gets a video stream up, analyses it and returns the aspect ratio to the |
+ // test through the automation controller. |
function getUserMediaAndAnalyseAndStop(constraints) { |
+ console.log('Calling getUserMediaAndAnalyseAndStop.'); |
navigator.webkitGetUserMedia( |
constraints, displayDetectAndAnalyzeVideo, failedCallback); |
} |
@@ -60,6 +66,7 @@ |
// This test that a MediaStream can be cloned and that the clone can |
// be rendered. |
function getUserMediaAndClone() { |
+ console.log('Calling getUserMediaAndClone.'); |
navigator.webkitGetUserMedia({video: true, audio: true}, |
createAndRenderClone, failedCallback); |
} |
@@ -69,36 +76,35 @@ |
// streams have the same source, both video streams should stop. If they do, |
// the test succeeds. |
function twoGetUserMediaAndStop(constraints) { |
- document.title = 'Calling Two GetUserMedia'; |
+ console.log('Calling Two GetUserMedia'); |
navigator.webkitGetUserMedia( |
constraints, |
- function(stream) { |
- displayAndDetectVideo(stream, requestSecondGetUserMedia); |
+ function(stream) { |
+ displayAndDetectVideo(stream, requestSecondGetUserMedia); |
}, |
failedCallback); |
var requestSecondGetUserMedia = function() { |
navigator.webkitGetUserMedia( |
constraints, |
- function(stream) { |
- displayIntoVideoElement(stream, |
+ function(stream) { |
+ displayIntoVideoElement(stream, |
stopStreamAndVerifyAllLocalViewsDontPlayVideo, 'local-view-2'); |
}, |
failedCallback); |
}; |
- |
+ |
var stopStreamAndVerifyAllLocalViewsDontPlayVideo = function() { |
gLocalStream.getVideoTracks()[0].stop(); |
- |
+ |
// Since local-view and local-view-2 are playing the video from the same |
// source, both of them should stop. |
waitForVideoToStop('local-view'); |
waitForVideoToStop('local-view-2'); |
- }; |
+ }; |
} |
function failedCallback(error) { |
- document.title = 'GetUserMedia call failed with code ' + error.code; |
- sendValueToTest(document.title); |
+ failTest('GetUserMedia call failed with code ' + error.code); |
} |
function plugStreamIntoVideoElement(stream, videoElement) { |
@@ -109,7 +115,6 @@ |
function displayIntoVideoElement(stream, callback, videoElement) { |
plugStreamIntoVideoElement(stream, videoElement); |
- document.title = 'Waiting for video...'; |
detectVideoPlaying(videoElement, callback); |
} |
@@ -128,12 +133,12 @@ |
// work with audio devices and not all bots has a microphone. |
new_stream = new webkitMediaStream(); |
new_stream.addTrack(stream.getVideoTracks()[0]); |
- expectEquals(new_stream.getVideoTracks().length, 1); |
+ assertEquals(new_stream.getVideoTracks().length, 1); |
if (stream.getAudioTracks().length > 0) { |
new_stream.addTrack(stream.getAudioTracks()[0]); |
- expectEquals(new_stream.getAudioTracks().length, 1); |
+ assertEquals(new_stream.getAudioTracks().length, 1); |
new_stream.removeTrack(new_stream.getAudioTracks()[0]); |
- expectEquals(new_stream.getAudioTracks().length, 0); |
+ assertEquals(new_stream.getAudioTracks().length, 0); |
} |
var newStreamUrl = URL.createObjectURL(new_stream); |
@@ -147,19 +152,101 @@ |
} |
function waitAndStopVideoTrack(waitTimeInSeconds) { |
- document.title = 'Running...'; |
setTimeout(stopVideoTrack, waitTimeInSeconds * 1000); |
} |
function analyzeVideo() { |
- document.title = 'Waiting for video...'; |
- addExpectedEvent(); |
detectAspectRatio(function(aspectRatio) { |
- document.title = aspectRatio; |
- eventOccured(); |
+ sendValueToTest(aspectRatio); |
}); |
} |
+ // This function tries to calculate the aspect ratio shown by the fake capture |
phoglund_chromium
2014/03/07 13:41:18
Moved this guy: it seemed to belong here rather th
|
+ // device in the video tag. For this, we count the amount of light green |
+ // pixels along |aperture| pixels on the positive X and Y axis starting from |
+ // the center of the image. In this very center there should be a time-varying |
+ // pacman; the algorithm counts for a couple of iterations and keeps the |
+ // maximum amount of light green pixels on both directions. From this data |
+ // the aspect ratio is calculated relative to a 320x240 window, so 4:3 would |
+ // show as a 1. Furthermore, since an original non-4:3 might be letterboxed or |
+ // cropped, the actual X and Y pixel amounts are compared with the fake video |
+ // capture expected pacman radius (see further below). |
+ function detectAspectRatio(callback) { |
+ var width = VIDEO_TAG_WIDTH; |
+ var height = VIDEO_TAG_HEIGHT; |
+ var videoElement = $('local-view'); |
+ var canvas = $('local-view-canvas'); |
+ |
+ var maxLightGreenPixelsX = 0; |
+ var maxLightGreenPixelsY = 0; |
+ |
+ var aperture = Math.min(width, height) / 2; |
+ var iterations = 0; |
+ var maxIterations = 10; |
+ |
+ var waitVideo = setInterval(function() { |
+ var context = canvas.getContext('2d'); |
+ context.drawImage(videoElement, 0, 0, width, height); |
+ |
+ // We are interested in a window starting from the center of the image |
+ // where we expect the circle from the fake video capture to be rolling. |
+ var pixels = |
+ context.getImageData(width / 2, height / 2, aperture, aperture); |
+ |
+ var lightGreenPixelsX = 0; |
+ var lightGreenPixelsY = 0; |
+ |
+ // Walk horizontally counting light green pixels. |
+ for (var x = 0; x < aperture; ++x) { |
+ if (pixels.data[4 * x + 1] != COLOR_BACKGROUND_GREEN) |
+ lightGreenPixelsX++; |
+ } |
+ // Walk vertically counting light green pixels. |
+ for (var y = 0; y < aperture; ++y) { |
+ if (pixels.data[4 * y * aperture + 1] != 135) |
+ lightGreenPixelsY++; |
+ } |
+ if (lightGreenPixelsX > maxLightGreenPixelsX && |
+ lightGreenPixelsX < aperture) |
+ maxLightGreenPixelsX = lightGreenPixelsX; |
+ if (lightGreenPixelsY > maxLightGreenPixelsY && |
+ lightGreenPixelsY < aperture) |
+ maxLightGreenPixelsY = lightGreenPixelsY; |
+ |
+ var detectedAspectRatioString = ""; |
+ if (++iterations > maxIterations) { |
+ clearInterval(waitVideo); |
+ observedAspectRatio = maxLightGreenPixelsY / maxLightGreenPixelsX; |
+ // At this point the observed aspect ratio is either 1, for undistorted |
+ // 4:3, or some other aspect ratio that is seen as distorted. |
+ if (Math.abs(observedAspectRatio - 1.333) < 0.1) |
+ detectedAspectRatioString = "16:9"; |
+ else if (Math.abs(observedAspectRatio - 1.20) < 0.1) |
+ detectedAspectRatioString = "16:10"; |
+ else if (Math.abs(observedAspectRatio - 1.0) < 0.1) |
+ detectedAspectRatioString = "4:3"; |
+ else |
+ detectedAspectRatioString = "UNKNOWN aspect ratio"; |
+ console.log(detectedAspectRatioString + " observed aspect ratio (" + |
+ observedAspectRatio + ")"); |
+ |
+ // The FakeVideoCapture calculates the circle radius as |
+ // std::min(capture_format_.width, capture_format_.height) / 4; |
+ // we do the same and see if both dimensions are scaled, meaning |
+ // we started from a cropped or stretched image. |
+ var nonDistortedRadius = Math.min(width, height) / 4; |
+ if ((maxLightGreenPixelsX != nonDistortedRadius) && |
+ (maxLightGreenPixelsY != nonDistortedRadius)) { |
+ detectedAspectRatioString += " cropped"; |
+ } else |
+ detectedAspectRatioString += " letterbox"; |
+ |
+ console.log("Original image is: " + detectedAspectRatioString); |
+ callback(detectedAspectRatioString); |
+ } |
+ }, |
+ 50); |
perkj_chrome
2014/03/07 14:00:21
indentation? maybe a comment saying what 50 means.
phoglund_chromium
2014/03/07 14:23:36
Done.
|
+ } |
</script> |
</head> |
<body> |