summaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorcpaulin <cpaulin@chromium.org>2015-10-12 15:43:29 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-12 22:44:26 +0000
commit4db46d73b08de41f0d838408b9b79b8844769489 (patch)
tree3ca4a00e83b2f551b6052ca06c9319205ba0a88c /tools/perf
parent3171f1efb0b5e07049de8570e633a71cd321ad13 (diff)
downloadchromium_src-4db46d73b08de41f0d838408b9b79b8844769489.zip
chromium_src-4db46d73b08de41f0d838408b9b79b8844769489.tar.gz
chromium_src-4db46d73b08de41f0d838408b9b79b8844769489.tar.bz2
Telemetry Test for WebRTC Rendering.
Design doc: https://docs.google.com/document/d/1TX0NnT_xxvnRNDkw6P2kxunXyK_I8OChkLb4jehXR9I/edit BUG= CQ_EXTRA_TRYBOTS=tryserver.chromium.perf:linux_perf_bisect;tryserver.chromium.perf:mac_10_10_perf_bisect;tryserver.chromium.perf:win_perf_bisect;tryserver.chromium.perf:android_nexus5_perf_bisect Review URL: https://codereview.chromium.org/1254023003 Cr-Commit-Position: refs/heads/master@{#353615}
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/benchmarks/webrtc_rendering.py33
-rw-r--r--tools/perf/page_sets/webrtc_rendering/loopback_peerconnection.html128
-rw-r--r--tools/perf/page_sets/webrtc_rendering_measurement.py36
3 files changed, 197 insertions, 0 deletions
diff --git a/tools/perf/benchmarks/webrtc_rendering.py b/tools/perf/benchmarks/webrtc_rendering.py
new file mode 100644
index 0000000..273c71b
--- /dev/null
+++ b/tools/perf/benchmarks/webrtc_rendering.py
@@ -0,0 +1,33 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from core import perf_benchmark
+from telemetry.timeline import tracing_category_filter
+from telemetry.web_perf import timeline_based_measurement
+
+import page_sets
+
+BENCHMARK_VALUES = 'WebRTCRendering_'
+
+class WebRTCRendering(perf_benchmark.PerfBenchmark):
+ """Timeline based benchmark for the WebRtc rendering."""
+
+ page_set = page_sets.WebrtcRenderingPageSet
+
+ def CreateTimelineBasedMeasurementOptions(self):
+ cc_filter = tracing_category_filter.TracingCategoryFilter(
+ filter_string='webrtc,webkit.console,blink.console')
+ return timeline_based_measurement.Options(overhead_level=cc_filter)
+
+ def SetExtraBrowserOptions(self, options):
+ options.AppendExtraBrowserArgs('--use-fake-device-for-media-stream')
+ options.AppendExtraBrowserArgs('--use-fake-ui-for-media-stream')
+
+ @classmethod
+ def Name(cls):
+ return 'webrtc_rendering.webrtc_rendering'
+
+ @classmethod
+ def ValueCanBeAddedPredicate(cls, value, is_first_result):
+ return value.name.startswith(BENCHMARK_VALUES)
diff --git a/tools/perf/page_sets/webrtc_rendering/loopback_peerconnection.html b/tools/perf/page_sets/webrtc_rendering/loopback_peerconnection.html
new file mode 100644
index 0000000..54ed678
--- /dev/null
+++ b/tools/perf/page_sets/webrtc_rendering/loopback_peerconnection.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html>
+<head><title>Loopback test</title></head>
+<body>
+ <video id="localVideo" width="1280" height="720" autoplay muted></video>
+ <video id="remoteVideo" width="1280" height="720" autoplay muted></video>
+<script>
+
+"use strict";
+
+var testDone = 0;
+var errors = "";
+
+// Starts the test.
+function testCamera(resolution) {
+ var test = new CameraTest(resolution);
+ test.run();
+}
+
+
+function CameraTest(resolutionArray) {
+ this.resolution = resolutionArray;
+ this.localStream = null;
+ this.remoteStream = null;
+ this.remoteVideo = document.getElementById("remoteVideo");
+ this.localVideo = document.getElementById("localVideo");
+ this.localVideo.width = this.resolution[0].toString();
+ this.localVideo.height = this.resolution[1].toString();
+ this.remoteVideo.width = this.resolution[0].toString();
+ this.remoteVideo.height = this.resolution[1].toString();
+}
+
+
+CameraTest.prototype = {
+ run: function() {
+ this.triggerGetUserMedia(this.resolution);
+ },
+
+ triggerGetUserMedia: function(resolution) {
+ var constraints = {
+ audio: false,
+ video: {
+ mandatory: {
+ minWidth: resolution[0],
+ minHeight: resolution[1],
+ maxWidth: resolution[0],
+ maxHeight: resolution[1]
+ }
+ }
+ };
+ try {
+ this.doGetUserMedia(constraints, this.gotLocalStream.bind(this),
+ this.onGetUserMediaError.bind(this));
+ } catch (exception) {
+ console.log('Unexpected exception: ', exception);
+ this.reportError('gUM', 'doGetUserMedia failed: ' + exception);
+ }
+ },
+
+ reportError: function(errorType, message) {
+ console.log(errorType, message);
+ errors = message;
+ },
+
+ doGetUserMedia: function(constraints, onSuccess, onFail) {
+ navigator.getUserMedia = navigator.getUserMedia ||
+ navigator.webkitGetUserMedia;
+ navigator.getUserMedia(constraints, onSuccess, onFail);
+ },
+
+ gotLocalStream: function(stream) {
+ this.localStream = stream;
+ var servers = null;
+
+ this.localPeerConnection = new webkitRTCPeerConnection(servers);
+ this.localPeerConnection.onicecandidate = this.gotLocalIceCandidate.bind(
+ this);
+
+ this.remotePeerConnection = new webkitRTCPeerConnection(servers);
+ this.remotePeerConnection.onicecandidate = this.gotRemoteIceCandidate.bind(
+ this);
+ this.remotePeerConnection.onaddstream = this.gotRemoteStream.bind(this);
+
+ this.localPeerConnection.addStream(this.localStream);
+ this.localPeerConnection.createOffer(this.gotLocalDescription.bind(this));
+ this.localVideo.src = URL.createObjectURL(stream);
+ },
+
+ onGetUserMediaError: function(stream) {
+ this.reportError('gUM', 'gUM call failed');
+ },
+
+ gotRemoteStream: function(event) {
+ this.remoteVideo.src = URL.createObjectURL(event.stream);
+ },
+
+ gotLocalDescription: function(description) {
+ this.localPeerConnection.setLocalDescription(description);
+ this.remotePeerConnection.setRemoteDescription(description);
+ this.remotePeerConnection.createAnswer(this.gotRemoteDescription.bind(
+ this));
+ },
+
+ gotRemoteDescription: function(description) {
+ this.remotePeerConnection.setLocalDescription(description);
+ this.localPeerConnection.setRemoteDescription(description);
+ },
+
+ gotLocalIceCandidate: function(event) {
+ if (event.candidate)
+ this.remotePeerConnection.addIceCandidate(
+ new RTCIceCandidate(event.candidate));
+ },
+
+ gotRemoteIceCandidate: function(event) {
+ if (event.candidate)
+ this.localPeerConnection.addIceCandidate(
+ new RTCIceCandidate(event.candidate));
+ },
+}
+
+window.onerror = function (message, filename, lineno, colno, error) {
+ console.log("Something went wrong, here is the stack trace --> %s",
+ error.stack);
+};
+</script>
+</body>
+</html>
diff --git a/tools/perf/page_sets/webrtc_rendering_measurement.py b/tools/perf/page_sets/webrtc_rendering_measurement.py
new file mode 100644
index 0000000..ea666f4
--- /dev/null
+++ b/tools/perf/page_sets/webrtc_rendering_measurement.py
@@ -0,0 +1,36 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from telemetry.page import page as page_module
+from telemetry.page import page_test as page_test
+from telemetry import story
+
+
+class WebrtcRenderingPage(page_module.Page):
+
+ def __init__(self, url, page_set):
+ super(WebrtcRenderingPage, self).__init__(
+ url=url,
+ page_set=page_set,
+ name='webrtc_rendering_page')
+
+ def RunPageInteractions(self, action_runner):
+ with action_runner.CreateInteraction('Action_Create_PeerConnection',
+ repeatable=False):
+ command = 'testCamera([%s, %s]);' % (1280, 720)
+ action_runner.ExecuteJavaScript(command)
+ action_runner.Wait(30)
+ errors = action_runner.EvaluateJavaScript('errors')
+ if errors:
+ raise page_test.Failure('Errors on page: ' + ', '.join(errors))
+
+
+class WebrtcRenderingPageSet(story.StorySet):
+ """ A benchmark of webrtc rendering performance."""
+
+ def __init__(self):
+ super(WebrtcRenderingPageSet, self).__init__()
+
+ url = ('file://webrtc_rendering/loopback_peerconnection.html')
+ self.AddStory(WebrtcRenderingPage(url, self))