diff options
author | cpaulin <cpaulin@chromium.org> | 2015-10-12 15:43:29 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-12 22:44:26 +0000 |
commit | 4db46d73b08de41f0d838408b9b79b8844769489 (patch) | |
tree | 3ca4a00e83b2f551b6052ca06c9319205ba0a88c /tools/perf | |
parent | 3171f1efb0b5e07049de8570e633a71cd321ad13 (diff) | |
download | chromium_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.py | 33 | ||||
-rw-r--r-- | tools/perf/page_sets/webrtc_rendering/loopback_peerconnection.html | 128 | ||||
-rw-r--r-- | tools/perf/page_sets/webrtc_rendering_measurement.py | 36 |
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)) |