Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 13 additions & 12 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -158,23 +158,24 @@ <h2 id="peerconnection"><a href="https://developer.mozilla.org/en-US/docs/Web/AP

<li><a href="src/content/peerconnection/per-frame-callback/">RTCPeerConnection and requestVideoFrameCallback()</a></li>

<li><a href="src/content/peerconnection/create-offer/">Display createOffer output for various scenarios</a>
</li>

<li><a href="src/content/peerconnection/create-offer/">Display createOffer output for various scenarios</a></li>

<li><a href="src/content/peerconnection/dtmf/">Use RTCDTMFSender</a></li>

<li><a href="src/content/peerconnection/states/">Display peer connection states</a></li>

<li><a href="src/content/peerconnection/trickle-ice/">ICE candidate gathering from STUN/TURN servers</a>
</li>


<li><a href="src/content/peerconnection/trickle-ice/">ICE candidate gathering from STUN/TURN servers</a> </li>

<li><a href="src/content/peerconnection/restart-ice/">Do an ICE restart</a></li>

<li><a href="src/content/peerconnection/webaudio-input/">Web Audio output as input to peer connection</a>
</li>


<li><a href="src/content/peerconnection/webaudio-input/">Web Audio output as input to peer connection</a></li>

<li><a href="src/content/peerconnection/video-playback-quality/">Peer connection with VideoPlaybackQuality metrics</a></li>

<li><a href="src/content/peerconnection/webaudio-output/">Peer connection as input to Web Audio</a></li>

<li><a href="src/content/peerconnection/negotiate-timing/">Measure how long renegotiation takes</a></li>

<li><a href="src/content/extensions/svc/">Choose scalablilityMode before call - Scalable Video Coding (SVC) Extension </a></li>
</ul>
<h2 id="datachannel"><a
Expand Down
125 changes: 125 additions & 0 deletions src/content/peerconnection/video-playback-quality/css/main.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
/*
* Copyright (c) 2025 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree.
*/

body {
font-family: sans-serif;
display: flex;
flex-direction: column;
align-items: center;
background-color: #f0f0f0;
color: #333;
}

.videos {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 20px;
margin-top: 20px;
}

video {
border: 2px solid #ccc;
border-radius: 8px;
width: 640px;
background: #000;
aspect-ratio: 16 / 9;
}

/* Grouped .video-container and .video-stats as they were identical */
.video-container,
.video-stats {
display: flex;
flex-direction: column;
align-items: center;
border-radius: 5px;
}

/* Grouped common properties for button and .source-selector */
button,
.source-selector {
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
margin: 0 10px;
box-sizing: border-box;
padding-top: 10px;
padding-bottom: 10px;
}

/* Unique button properties */
button {
padding-left: 20px;
padding-right: 20px;
color: white;
transition: background-color 0.3s;
}

/* Unique .source-selector properties */
.source-selector {
padding-left: 12px;
padding-right: 12px;
background-color: #fff;
color: #333;
outline: none;
}

.source-selector:focus {
border-color: #007bff;
box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
}

.source-selector option {
font-size: 14px;
color: #333;
}

.controls {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
gap: 20px;
margin-top: 20px;
padding: 10px;
background-color: #e9ecef;
border-radius: 8px;
}

.control-group {
display: flex;
align-items: center;
gap: 10px;
}

.stats-container {
justify-content: center;
gap: 20px;
margin-top: 20px;
}

.graph-container {
display: flex;
flex-direction: row;
align-items: center;
gap: 10px;
}

canvas {
border: 1px solid #ccc;
background-color: #fff;
width: 640px;
aspect-ratio: 16 / 9;
border-radius: 5px;
}

.graph-wrapper {
display: flex;
flex-direction: column;
}
121 changes: 121 additions & 0 deletions src/content/peerconnection/video-playback-quality/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<!DOCTYPE html>
<!--
* Copyright (c) 2025 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree.
-->
<html>

<head>
<meta charset="utf-8">
<meta name="description" content="WebRTC code samples">
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1, maximum-scale=1">
<meta itemprop="description" content="Client-side WebRTC code samples">
<meta itemprop="image" content="../../../images/webrtc-icon-192x192.png">
<meta itemprop="name" content="WebRTC code samples">
<meta name="mobile-web-app-capable" content="yes">
<meta id="theme-color" name="theme-color" content="#ffffff">

<base target="_blank">

<title>VideoPlaybackQuality</title>

<link rel="icon" sizes="192x192" href="../../../images/webrtc-icon-192x192.png">
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="../../../css/main.css">
<link rel="stylesheet" href="css/main.css">
</head>

<body>
<h1><a href="//webrtc.github.io/samples/" title="WebRTC samples homepage">WebRTC samples</a>
<span>PeerConnection with VideoPlaybackQuality</span>
</h1>
<div class="videos">
<div class="video-container">
<h2>Local Video</h2>
<video id="localVideo" autoplay muted playsinline></video>
</div>
<div class="video-container">
<h2>Remote Video</h2>
<video id="remoteVideo" autoplay playsinline></video>
</div>
</div>
<div class="controls">
<select class="source-selector" id="callSource">
<option value="camera">Camera</option>
<option value="screenshare">Screenshare</option>
</select>
<button id="callButton">Call</button>
<button id="hangupButton" disabled>Hang Up</button>
</div>

<fieldset id="burnControlsContainer" class="controls">
<div class="control-group">
<label for="oneTimeBurnSlider">One-time burn (ms): <span id="oneTimeBurnValue">120</span></label>
<input type="range" id="oneTimeBurnSlider" min="0" max="240" value="120">
<button id="oneTimeBurnButton">Burn Once</button>
</div>
<div class="control-group">
<label for="continuousBurnCheckbox">Continuous Burn</label>
<input type="checkbox" id="continuousBurnCheckbox">
</div>
<div class="control-group">
<label for="continuousBurnMeanSlider">Mean (ms): <span id="continuousBurnMeanValue">37</span></label>
<input type="range" id="continuousBurnMeanSlider" min="0" max="60" value="37">
</div>
<div class="control-group">
<label for="continuousBurnStdDevSlider">StdDev (ms): <span id="continuousBurnStdDevValue">15</span></label>
<input type="range" id="continuousBurnStdDevSlider" min="0" max="20" value="15">
</div>
</fieldset>
<div class="controls">
<div class="control-group">
<label for="showHarmonicFpsCheckbox">Display Harmonic FPS</label>
<input type="checkbox" id="showHarmonicFpsCheckbox" checked>
</div>
<div class="control-group">
<label for="showWebrtcHarmonicFpsCheckbox">WebRTC Harmonic FPS</label>
<input type="checkbox" id="showWebrtcHarmonicFpsCheckbox" checked>
</div>
<div class="control-group">
<label for="showJitterMetricCheckbox">Reproduction Jitter Metric</label>
<input type="checkbox" id="showJitterMetricCheckbox" checked>
</div>
<div class="control-group">
<button id="pauseGraphsButton">Pause Graphs</button>
</div>
</div>
<div class="stats-container">
<div class="video-stats">
<div class="graph-container">
<div class="graph-wrapper">
<h3 class="graph-title">Local FPS</h3>
<canvas id="localFpsGraphCanvas" width="600" height="250"></canvas>
</div>
<div class="graph-wrapper">
<h3 class="graph-title">Local Reproduction Jitter Metric</h3>
<canvas id="localRmseCanvas" width="600" height="250"></canvas>
</div>
</div>
</div>
<br />
<div class="video-stats">
<div class="graph-container">
<div class="graph-wrapper">
<h3 class="graph-title">Remote FPS</h3>
<canvas id="remoteFpsGraphCanvas" width="600" height="250"></canvas>
</div>
<div class="graph-wrapper">
<h3 class="graph-title">Remote Reproduction Jitter Metric</h3>
<canvas id="remoteRmseCanvas" width="600" height="250"></canvas>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="js/main.js" defer></script>
</body>

</html>
Loading
Loading