blob: 7ad7634c821279fba086328afb3d3ca4e0636c7d [file] [log] [blame]
/*
* Copyright 2017 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. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
package org.webrtc;
import java.util.Map;
/**
* Java version of webrtc::RTCStats. Represents an RTCStats object, as
* described in https://w3c.github.io/webrtc-stats/. The |id|, |timestampUs|
* and |type| accessors have the same meaning for this class as for the
* RTCStats dictionary. Each RTCStatsReport produced by getStats contains
* multiple RTCStats objects; one for each underlying object (codec, stream,
* transport, etc.) that was inspected to produce the stats.
*/
public class RTCStats {
private final long timestampUs;
private final String type;
private final String id;
private final Map<String, Object> members;
public RTCStats(long timestampUs, String type, String id, Map<String, Object> members) {
this.timestampUs = timestampUs;
this.type = type;
this.id = id;
this.members = members;
}
// Timestamp in microseconds.
public double getTimestampUs() {
return timestampUs;
}
// Equivalent to RTCStatsType in the stats spec. Indicates the type of the
// object that was inspected to produce the stats.
public String getType() {
return type;
}
// Unique ID representing this stats object. May be referred to by members of
// other stats objects.
public String getId() {
return id;
}
/**
* Returns map of member names to values. Returns as an ordered map so that
* the stats object can be serialized with a consistent ordering.
*
* Values will be one of the following objects:
* - Boolean
* - Integer (for 32-bit signed integers)
* - Long (for 32-bit unsigned and 64-bit signed integers)
* - BigInteger (for 64-bit unsigned integers)
* - Double
* - String
* - The array form of any of the above (e.g., Integer[])
*/
public Map<String, Object> getMembers() {
return members;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("{ timestampUs: ")
.append(timestampUs)
.append(", type: ")
.append(type)
.append(", id: ")
.append(id);
boolean first = true;
for (Map.Entry<String, Object> entry : members.entrySet()) {
builder.append(", ").append(entry.getKey()).append(": ");
appendValue(builder, entry.getValue());
}
builder.append(" }");
return builder.toString();
}
private static void appendValue(StringBuilder builder, Object value) {
if (value instanceof Object[]) {
Object[] arrayValue = (Object[]) value;
builder.append('[');
for (int i = 0; i < arrayValue.length; ++i) {
if (i != 0) {
builder.append(", ");
}
appendValue(builder, arrayValue[i]);
}
builder.append(']');
} else if (value instanceof String) {
// Enclose strings in quotes to make it clear they're strings.
builder.append('"').append(value).append('"');
} else {
builder.append(value);
}
}
// TODO(bugs.webrtc.org/8557) Use ctor directly with full Map type.
@SuppressWarnings("unchecked")
@CalledByNative
static RTCStats create(long timestampUs, String type, String id, Map members) {
return new RTCStats(timestampUs, type, id, members);
}
}