Switch kStatsValueName* constants to be enums instead of char*.

This is to guard against potentially assigning a value name to an incorrect value, non-static string or otherwise assume they can be treated as strings.

R=perkj@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/26359004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7884 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
tommi@webrtc.org
2014-12-12 17:41:28 +00:00
parent 3b79daff14
commit c57310b982
3 changed files with 288 additions and 255 deletions

View File

@ -1022,7 +1022,9 @@ class StatsObserverWrapper : public StatsObserver {
for (int i = 0; i < values.size(); ++i) {
ScopedLocalRefFrame local_ref_frame(jni);
const StatsReport::Value& value = values[i];
jstring j_name = JavaStringFromStdString(jni, value.name);
// Should we use the '.name' enum value here instead of converting the
// name to a string?
jstring j_name = JavaStringFromStdString(jni, value.display_name());
jstring j_value = JavaStringFromStdString(jni, value.value);
jobject j_element_value =
jni->NewObject(*j_value_class_, j_value_ctor_, j_name, j_value);

View File

@ -29,148 +29,6 @@
namespace webrtc {
// The items below are in alphabetical order.
const char StatsReport::kStatsValueNameActiveConnection[] =
"googActiveConnection";
const char StatsReport::kStatsValueNameActualEncBitrate[] =
"googActualEncBitrate";
const char StatsReport::kStatsValueNameAudioOutputLevel[] = "audioOutputLevel";
const char StatsReport::kStatsValueNameAudioInputLevel[] = "audioInputLevel";
const char StatsReport::kStatsValueNameAvailableReceiveBandwidth[] =
"googAvailableReceiveBandwidth";
const char StatsReport::kStatsValueNameAvailableSendBandwidth[] =
"googAvailableSendBandwidth";
const char StatsReport::kStatsValueNameAvgEncodeMs[] = "googAvgEncodeMs";
const char StatsReport::kStatsValueNameBucketDelay[] = "googBucketDelay";
const char StatsReport::kStatsValueNameBytesReceived[] = "bytesReceived";
const char StatsReport::kStatsValueNameBytesSent[] = "bytesSent";
const char StatsReport::kStatsValueNameBandwidthLimitedResolution[] =
"googBandwidthLimitedResolution";
const char StatsReport::kStatsValueNameCaptureJitterMs[] =
"googCaptureJitterMs";
const char StatsReport::kStatsValueNameCaptureQueueDelayMsPerS[] =
"googCaptureQueueDelayMsPerS";
const char StatsReport::kStatsValueNameChannelId[] = "googChannelId";
const char StatsReport::kStatsValueNameCodecName[] = "googCodecName";
const char StatsReport::kStatsValueNameComponent[] = "googComponent";
const char StatsReport::kStatsValueNameContentName[] = "googContentName";
const char StatsReport::kStatsValueNameCpuLimitedResolution[] =
"googCpuLimitedResolution";
const char StatsReport::kStatsValueNameDecodingCTSG[] =
"googDecodingCTSG";
const char StatsReport::kStatsValueNameDecodingCTN[] =
"googDecodingCTN";
const char StatsReport::kStatsValueNameDecodingNormal[] =
"googDecodingNormal";
const char StatsReport::kStatsValueNameDecodingPLC[] =
"googDecodingPLC";
const char StatsReport::kStatsValueNameDecodingCNG[] =
"googDecodingCNG";
const char StatsReport::kStatsValueNameDecodingPLCCNG[] =
"googDecodingPLCCNG";
const char StatsReport::kStatsValueNameDer[] = "googDerBase64";
// Echo metrics from the audio processing module.
const char StatsReport::kStatsValueNameEchoCancellationQualityMin[] =
"googEchoCancellationQualityMin";
const char StatsReport::kStatsValueNameEchoDelayMedian[] =
"googEchoCancellationEchoDelayMedian";
const char StatsReport::kStatsValueNameEchoDelayStdDev[] =
"googEchoCancellationEchoDelayStdDev";
const char StatsReport::kStatsValueNameEchoReturnLoss[] =
"googEchoCancellationReturnLoss";
const char StatsReport::kStatsValueNameEchoReturnLossEnhancement[] =
"googEchoCancellationReturnLossEnhancement";
const char StatsReport::kStatsValueNameEncodeUsagePercent[] =
"googEncodeUsagePercent";
const char StatsReport::kStatsValueNameExpandRate[] = "googExpandRate";
const char StatsReport::kStatsValueNameFingerprint[] = "googFingerprint";
const char StatsReport::kStatsValueNameFingerprintAlgorithm[] =
"googFingerprintAlgorithm";
const char StatsReport::kStatsValueNameFirsReceived[] = "googFirsReceived";
const char StatsReport::kStatsValueNameFirsSent[] = "googFirsSent";
const char StatsReport::kStatsValueNameFrameHeightInput[] =
"googFrameHeightInput";
const char StatsReport::kStatsValueNameFrameHeightReceived[] =
"googFrameHeightReceived";
const char StatsReport::kStatsValueNameFrameHeightSent[] =
"googFrameHeightSent";
const char StatsReport::kStatsValueNameFrameRateReceived[] =
"googFrameRateReceived";
const char StatsReport::kStatsValueNameFrameRateDecoded[] =
"googFrameRateDecoded";
const char StatsReport::kStatsValueNameFrameRateOutput[] =
"googFrameRateOutput";
const char StatsReport::kStatsValueNameDecodeMs[] = "googDecodeMs";
const char StatsReport::kStatsValueNameMaxDecodeMs[] = "googMaxDecodeMs";
const char StatsReport::kStatsValueNameCurrentDelayMs[] = "googCurrentDelayMs";
const char StatsReport::kStatsValueNameTargetDelayMs[] = "googTargetDelayMs";
const char StatsReport::kStatsValueNameJitterBufferMs[] = "googJitterBufferMs";
const char StatsReport::kStatsValueNameMinPlayoutDelayMs[] =
"googMinPlayoutDelayMs";
const char StatsReport::kStatsValueNameRenderDelayMs[] = "googRenderDelayMs";
const char StatsReport::kStatsValueNameCaptureStartNtpTimeMs[] =
"googCaptureStartNtpTimeMs";
const char StatsReport::kStatsValueNameFrameRateInput[] = "googFrameRateInput";
const char StatsReport::kStatsValueNameFrameRateSent[] = "googFrameRateSent";
const char StatsReport::kStatsValueNameFrameWidthInput[] =
"googFrameWidthInput";
const char StatsReport::kStatsValueNameFrameWidthReceived[] =
"googFrameWidthReceived";
const char StatsReport::kStatsValueNameFrameWidthSent[] = "googFrameWidthSent";
const char StatsReport::kStatsValueNameInitiator[] = "googInitiator";
const char StatsReport::kStatsValueNameIssuerId[] = "googIssuerId";
const char StatsReport::kStatsValueNameJitterReceived[] = "googJitterReceived";
const char StatsReport::kStatsValueNameLocalAddress[] = "googLocalAddress";
const char StatsReport::kStatsValueNameLocalCandidateType[] =
"googLocalCandidateType";
const char StatsReport::kStatsValueNameLocalCertificateId[] =
"googLocalCertificateId";
const char StatsReport::kStatsValueNameAdaptationChanges[] =
"googAdaptationChanges";
const char StatsReport::kStatsValueNameNacksReceived[] = "googNacksReceived";
const char StatsReport::kStatsValueNameNacksSent[] = "googNacksSent";
const char StatsReport::kStatsValueNamePlisReceived[] = "googPlisReceived";
const char StatsReport::kStatsValueNamePlisSent[] = "googPlisSent";
const char StatsReport::kStatsValueNamePacketsReceived[] = "packetsReceived";
const char StatsReport::kStatsValueNamePacketsSent[] = "packetsSent";
const char StatsReport::kStatsValueNamePacketsLost[] = "packetsLost";
const char StatsReport::kStatsValueNamePreferredJitterBufferMs[] =
"googPreferredJitterBufferMs";
const char StatsReport::kStatsValueNameReadable[] = "googReadable";
const char StatsReport::kStatsValueNameRecvPacketGroupArrivalTimeDebug[] =
"googReceivedPacketGroupArrivalTimeDebug";
const char StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaDebug[] =
"googReceivedPacketGroupPropagationDeltaDebug";
const char
StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug[] =
"googReceivedPacketGroupPropagationDeltaSumDebug";
const char StatsReport::kStatsValueNameRemoteAddress[] = "googRemoteAddress";
const char StatsReport::kStatsValueNameRemoteCandidateType[] =
"googRemoteCandidateType";
const char StatsReport::kStatsValueNameRemoteCertificateId[] =
"googRemoteCertificateId";
const char StatsReport::kStatsValueNameRetransmitBitrate[] =
"googRetransmitBitrate";
const char StatsReport::kStatsValueNameRtt[] = "googRtt";
const char StatsReport::kStatsValueNameSsrc[] = "ssrc";
const char StatsReport::kStatsValueNameSendPacketsDiscarded[] =
"packetsDiscardedOnSend";
const char StatsReport::kStatsValueNameTargetEncBitrate[] =
"googTargetEncBitrate";
const char StatsReport::kStatsValueNameTransmitBitrate[] =
"googTransmitBitrate";
const char StatsReport::kStatsValueNameTransportId[] = "transportId";
const char StatsReport::kStatsValueNameTransportType[] = "googTransportType";
const char StatsReport::kStatsValueNameTrackId[] = "googTrackId";
const char StatsReport::kStatsValueNameTypingNoiseState[] =
"googTypingNoiseState";
const char StatsReport::kStatsValueNameViewLimitedResolution[] =
"googViewLimitedResolution";
const char StatsReport::kStatsValueNameWritable[] = "googWritable";
const char StatsReport::kStatsReportTypeSession[] = "googLibjingleSession";
const char StatsReport::kStatsReportTypeBwe[] = "VideoBwe";
const char StatsReport::kStatsReportTypeRemoteSsrc[] = "remoteSsrc";
@ -218,10 +76,6 @@ bool StatsReport::operator==(const std::string& other_id) const {
return id == other_id;
}
StatsReport::Value::Value()
: name(NULL) {
}
// The copy ctor can't be declared as explicit due to problems with STL.
StatsReport::Value::Value(const Value& other)
: name(other.name), value(other.value) {
@ -241,11 +95,194 @@ StatsReport::Value& StatsReport::Value::operator=(const Value& other) {
return *this;
}
// TODO(tommi): Change implementation to do a simple enum value-to-static-
// string conversion when client code has been updated to use this method
// instead of the |name| member variable.
const char* StatsReport::Value::display_name() const {
return name;
switch (name) {
case kStatsValueNameAudioOutputLevel:
return "audioOutputLevel";
case kStatsValueNameAudioInputLevel:
return "audioInputLevel";
case kStatsValueNameBytesSent:
return "bytesSent";
case kStatsValueNamePacketsSent:
return "packetsSent";
case kStatsValueNameBytesReceived:
return "bytesReceived";
case kStatsValueNamePacketsReceived:
return "packetsReceived";
case kStatsValueNamePacketsLost:
return "packetsLost";
case kStatsValueNameTransportId:
return "transportId";
case kStatsValueNameSsrc:
return "ssrc";
// 'goog' prefixed constants.
case kStatsValueNameActiveConnection:
return "googActiveConnection";
case kStatsValueNameActualEncBitrate:
return "googActualEncBitrate";
case kStatsValueNameAvailableReceiveBandwidth:
return "googAvailableReceiveBandwidth";
case kStatsValueNameAvailableSendBandwidth:
return "googAvailableSendBandwidth";
case kStatsValueNameAvgEncodeMs:
return "googAvgEncodeMs";
case kStatsValueNameBucketDelay:
return "googBucketDelay";
case kStatsValueNameBandwidthLimitedResolution:
return "googBandwidthLimitedResolution";
case kStatsValueNameCaptureJitterMs:
return "googCaptureJitterMs";
case kStatsValueNameCaptureQueueDelayMsPerS:
return "googCaptureQueueDelayMsPerS";
case kStatsValueNameChannelId:
return "googChannelId";
case kStatsValueNameCodecName:
return "googCodecName";
case kStatsValueNameComponent:
return "googComponent";
case kStatsValueNameContentName:
return "googContentName";
case kStatsValueNameCpuLimitedResolution:
return "googCpuLimitedResolution";
case kStatsValueNameDecodingCTSG:
return "googDecodingCTSG";
case kStatsValueNameDecodingCTN:
return "googDecodingCTN";
case kStatsValueNameDecodingNormal:
return "googDecodingNormal";
case kStatsValueNameDecodingPLC:
return "googDecodingPLC";
case kStatsValueNameDecodingCNG:
return "googDecodingCNG";
case kStatsValueNameDecodingPLCCNG:
return "googDecodingPLCCNG";
case kStatsValueNameDer:
return "googDerBase64";
case kStatsValueNameEchoCancellationQualityMin:
return "googEchoCancellationQualityMin";
case kStatsValueNameEchoDelayMedian:
return "googEchoCancellationEchoDelayMedian";
case kStatsValueNameEchoDelayStdDev:
return "googEchoCancellationEchoDelayStdDev";
case kStatsValueNameEchoReturnLoss:
return "googEchoCancellationReturnLoss";
case kStatsValueNameEchoReturnLossEnhancement:
return "googEchoCancellationReturnLossEnhancement";
case kStatsValueNameEncodeUsagePercent:
return "googEncodeUsagePercent";
case kStatsValueNameExpandRate:
return "googExpandRate";
case kStatsValueNameFingerprint:
return "googFingerprint";
case kStatsValueNameFingerprintAlgorithm:
return "googFingerprintAlgorithm";
case kStatsValueNameFirsReceived:
return "googFirsReceived";
case kStatsValueNameFirsSent:
return "googFirsSent";
case kStatsValueNameFrameHeightInput:
return "googFrameHeightInput";
case kStatsValueNameFrameHeightReceived:
return "googFrameHeightReceived";
case kStatsValueNameFrameHeightSent:
return "googFrameHeightSent";
case kStatsValueNameFrameRateReceived:
return "googFrameRateReceived";
case kStatsValueNameFrameRateDecoded:
return "googFrameRateDecoded";
case kStatsValueNameFrameRateOutput:
return "googFrameRateOutput";
case kStatsValueNameDecodeMs:
return "googDecodeMs";
case kStatsValueNameMaxDecodeMs:
return "googMaxDecodeMs";
case kStatsValueNameCurrentDelayMs:
return "googCurrentDelayMs";
case kStatsValueNameTargetDelayMs:
return "googTargetDelayMs";
case kStatsValueNameJitterBufferMs:
return "googJitterBufferMs";
case kStatsValueNameMinPlayoutDelayMs:
return "googMinPlayoutDelayMs";
case kStatsValueNameRenderDelayMs:
return "googRenderDelayMs";
case kStatsValueNameCaptureStartNtpTimeMs:
return "googCaptureStartNtpTimeMs";
case kStatsValueNameFrameRateInput:
return "googFrameRateInput";
case kStatsValueNameFrameRateSent:
return "googFrameRateSent";
case kStatsValueNameFrameWidthInput:
return "googFrameWidthInput";
case kStatsValueNameFrameWidthReceived:
return "googFrameWidthReceived";
case kStatsValueNameFrameWidthSent:
return "googFrameWidthSent";
case kStatsValueNameInitiator:
return "googInitiator";
case kStatsValueNameIssuerId:
return "googIssuerId";
case kStatsValueNameJitterReceived:
return "googJitterReceived";
case kStatsValueNameLocalAddress:
return "googLocalAddress";
case kStatsValueNameLocalCandidateType:
return "googLocalCandidateType";
case kStatsValueNameLocalCertificateId:
return "googLocalCertificateId";
case kStatsValueNameAdaptationChanges:
return "googAdaptationChanges";
case kStatsValueNameNacksReceived:
return "googNacksReceived";
case kStatsValueNameNacksSent:
return "googNacksSent";
case kStatsValueNamePlisReceived:
return "googPlisReceived";
case kStatsValueNamePlisSent:
return "googPlisSent";
case kStatsValueNamePreferredJitterBufferMs:
return "googPreferredJitterBufferMs";
case kStatsValueNameReadable:
return "googReadable";
case kStatsValueNameRecvPacketGroupArrivalTimeDebug:
return "googReceivedPacketGroupArrivalTimeDebug";
case kStatsValueNameRecvPacketGroupPropagationDeltaDebug:
return "googReceivedPacketGroupPropagationDeltaDebug";
case kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug:
return "googReceivedPacketGroupPropagationDeltaSumDebug";
case kStatsValueNameRemoteAddress:
return "googRemoteAddress";
case kStatsValueNameRemoteCandidateType:
return "googRemoteCandidateType";
case kStatsValueNameRemoteCertificateId:
return "googRemoteCertificateId";
case kStatsValueNameRetransmitBitrate:
return "googRetransmitBitrate";
case kStatsValueNameRtt:
return "googRtt";
case kStatsValueNameSendPacketsDiscarded:
return "packetsDiscardedOnSend";
case kStatsValueNameTargetEncBitrate:
return "googTargetEncBitrate";
case kStatsValueNameTransmitBitrate:
return "googTransmitBitrate";
case kStatsValueNameTransportType:
return "googTransportType";
case kStatsValueNameTrackId:
return "googTrackId";
case kStatsValueNameTypingNoiseState:
return "googTypingNoiseState";
case kStatsValueNameViewLimitedResolution:
return "googViewLimitedResolution";
case kStatsValueNameWritable:
return "googWritable";
default:
ASSERT(false);
break;
}
return nullptr;
}
void StatsReport::AddValue(StatsReport::StatsValueName name,

View File

@ -65,10 +65,6 @@ class StatsReport {
// without requiring a new StatsReport instance.
bool operator==(const std::string& other_id) const;
// TODO(tommi): Change this to be an enum type that holds all the
// kStatsValueName constants.
typedef const char* StatsValueName;
// The unique identifier for this object.
// This is used as a key for this report in ordered containers,
// so it must never be changed.
@ -76,8 +72,102 @@ class StatsReport {
std::string id; // See below for contents.
std::string type; // See below for contents.
// StatsValue names.
enum StatsValueName {
kStatsValueNameActiveConnection,
kStatsValueNameAudioInputLevel,
kStatsValueNameAudioOutputLevel,
kStatsValueNameBytesReceived,
kStatsValueNameBytesSent,
kStatsValueNamePacketsLost,
kStatsValueNamePacketsReceived,
kStatsValueNamePacketsSent,
kStatsValueNameReadable,
kStatsValueNameSsrc,
kStatsValueNameTransportId,
// Internal StatsValue names.
kStatsValueNameActualEncBitrate,
kStatsValueNameAdaptationChanges,
kStatsValueNameAvailableReceiveBandwidth,
kStatsValueNameAvailableSendBandwidth,
kStatsValueNameAvgEncodeMs,
kStatsValueNameBandwidthLimitedResolution,
kStatsValueNameBucketDelay,
kStatsValueNameCaptureJitterMs,
kStatsValueNameCaptureQueueDelayMsPerS,
kStatsValueNameCaptureStartNtpTimeMs,
kStatsValueNameChannelId,
kStatsValueNameCodecName,
kStatsValueNameComponent,
kStatsValueNameContentName,
kStatsValueNameCpuLimitedResolution,
kStatsValueNameCurrentDelayMs,
kStatsValueNameDecodeMs,
kStatsValueNameDecodingCNG,
kStatsValueNameDecodingCTN,
kStatsValueNameDecodingCTSG,
kStatsValueNameDecodingNormal,
kStatsValueNameDecodingPLC,
kStatsValueNameDecodingPLCCNG,
kStatsValueNameDer,
kStatsValueNameEchoCancellationQualityMin,
kStatsValueNameEchoDelayMedian,
kStatsValueNameEchoDelayStdDev,
kStatsValueNameEchoReturnLoss,
kStatsValueNameEchoReturnLossEnhancement,
kStatsValueNameEncodeUsagePercent,
kStatsValueNameExpandRate,
kStatsValueNameFingerprint,
kStatsValueNameFingerprintAlgorithm,
kStatsValueNameFirsReceived,
kStatsValueNameFirsSent,
kStatsValueNameFrameHeightInput,
kStatsValueNameFrameHeightReceived,
kStatsValueNameFrameHeightSent,
kStatsValueNameFrameRateDecoded,
kStatsValueNameFrameRateInput,
kStatsValueNameFrameRateOutput,
kStatsValueNameFrameRateReceived,
kStatsValueNameFrameRateSent,
kStatsValueNameFrameWidthInput,
kStatsValueNameFrameWidthReceived,
kStatsValueNameFrameWidthSent,
kStatsValueNameInitiator,
kStatsValueNameIssuerId,
kStatsValueNameJitterBufferMs,
kStatsValueNameJitterReceived,
kStatsValueNameLocalAddress,
kStatsValueNameLocalCandidateType,
kStatsValueNameLocalCertificateId,
kStatsValueNameMaxDecodeMs,
kStatsValueNameMinPlayoutDelayMs,
kStatsValueNameNacksReceived,
kStatsValueNameNacksSent,
kStatsValueNamePlisReceived,
kStatsValueNamePlisSent,
kStatsValueNamePreferredJitterBufferMs,
kStatsValueNameRecvPacketGroupArrivalTimeDebug,
kStatsValueNameRecvPacketGroupPropagationDeltaDebug,
kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug,
kStatsValueNameRemoteAddress,
kStatsValueNameRemoteCandidateType,
kStatsValueNameRemoteCertificateId,
kStatsValueNameRenderDelayMs,
kStatsValueNameRetransmitBitrate,
kStatsValueNameRtt,
kStatsValueNameSendPacketsDiscarded,
kStatsValueNameTargetDelayMs,
kStatsValueNameTargetEncBitrate,
kStatsValueNameTrackId,
kStatsValueNameTransmitBitrate,
kStatsValueNameTransportType,
kStatsValueNameTypingNoiseState,
kStatsValueNameViewLimitedResolution,
kStatsValueNameWritable,
};
struct Value {
Value();
// The copy ctor can't be declared as explicit due to problems with STL.
Value(const Value& other);
explicit Value(StatsValueName name);
@ -88,9 +178,7 @@ class StatsReport {
// The public |name| member variable is otherwise meant to be read-only.
Value& operator=(const Value& other);
// TODO(tommi): Change implementation to do a simple enum value-to-static-
// string conversion when client code has been updated to use this method
// instead of the |name| member variable.
// Returns the string representation of |name|.
const char* display_name() const;
const StatsValueName name;
@ -153,9 +241,6 @@ class StatsReport {
// ICE Candidate. It links to its transport.
static const char kStatsReportTypeIceCandidate[];
// The id of StatsReport of type VideoBWE.
static const char kStatsReportVideoBweId[];
// A StatsReport of |type| = "googCertificate" contains an SSL certificate
// transmitted by one of the endpoints of this connection. The |id| is
// controlled by the fingerprint, and is used to identify the certificate in
@ -164,99 +249,8 @@ class StatsReport {
// "googIssuerId").
static const char kStatsReportTypeCertificate[];
// StatsValue names
static const char kStatsValueNameAudioOutputLevel[];
static const char kStatsValueNameAudioInputLevel[];
static const char kStatsValueNameBytesSent[];
static const char kStatsValueNamePacketsSent[];
static const char kStatsValueNameBytesReceived[];
static const char kStatsValueNamePacketsReceived[];
static const char kStatsValueNamePacketsLost[];
static const char kStatsValueNameTransportId[];
static const char kStatsValueNameLocalAddress[];
static const char kStatsValueNameRemoteAddress[];
static const char kStatsValueNameWritable[];
static const char kStatsValueNameReadable[];
static const char kStatsValueNameActiveConnection[];
// Internal StatsValue names
static const char kStatsValueNameAvgEncodeMs[];
static const char kStatsValueNameEncodeUsagePercent[];
static const char kStatsValueNameCaptureJitterMs[];
static const char kStatsValueNameCaptureQueueDelayMsPerS[];
static const char kStatsValueNameCodecName[];
static const char kStatsValueNameBandwidthLimitedResolution[];
static const char kStatsValueNameCpuLimitedResolution[];
static const char kStatsValueNameViewLimitedResolution[];
static const char kStatsValueNameAdaptationChanges[];
static const char kStatsValueNameEchoCancellationQualityMin[];
static const char kStatsValueNameEchoDelayMedian[];
static const char kStatsValueNameEchoDelayStdDev[];
static const char kStatsValueNameEchoReturnLoss[];
static const char kStatsValueNameEchoReturnLossEnhancement[];
static const char kStatsValueNameExpandRate[];
static const char kStatsValueNameFirsReceived[];
static const char kStatsValueNameFirsSent[];
static const char kStatsValueNameFrameHeightInput[];
static const char kStatsValueNameFrameHeightReceived[];
static const char kStatsValueNameFrameHeightSent[];
static const char kStatsValueNameFrameRateReceived[];
static const char kStatsValueNameFrameRateDecoded[];
static const char kStatsValueNameFrameRateOutput[];
static const char kStatsValueNameDecodeMs[];
static const char kStatsValueNameMaxDecodeMs[];
static const char kStatsValueNameCurrentDelayMs[];
static const char kStatsValueNameTargetDelayMs[];
static const char kStatsValueNameJitterBufferMs[];
static const char kStatsValueNameMinPlayoutDelayMs[];
static const char kStatsValueNameRenderDelayMs[];
static const char kStatsValueNameCaptureStartNtpTimeMs[];
static const char kStatsValueNameFrameRateInput[];
static const char kStatsValueNameFrameRateSent[];
static const char kStatsValueNameFrameWidthInput[];
static const char kStatsValueNameFrameWidthReceived[];
static const char kStatsValueNameFrameWidthSent[];
static const char kStatsValueNameJitterReceived[];
static const char kStatsValueNameNacksReceived[];
static const char kStatsValueNameNacksSent[];
static const char kStatsValueNamePlisReceived[];
static const char kStatsValueNamePlisSent[];
static const char kStatsValueNamePreferredJitterBufferMs[];
static const char kStatsValueNameRtt[];
static const char kStatsValueNameAvailableSendBandwidth[];
static const char kStatsValueNameAvailableReceiveBandwidth[];
static const char kStatsValueNameTargetEncBitrate[];
static const char kStatsValueNameActualEncBitrate[];
static const char kStatsValueNameRetransmitBitrate[];
static const char kStatsValueNameTransmitBitrate[];
static const char kStatsValueNameBucketDelay[];
static const char kStatsValueNameInitiator[];
static const char kStatsValueNameTransportType[];
static const char kStatsValueNameContentName[];
static const char kStatsValueNameComponent[];
static const char kStatsValueNameChannelId[];
static const char kStatsValueNameTrackId[];
static const char kStatsValueNameSsrc[];
static const char kStatsValueNameSendPacketsDiscarded[];
static const char kStatsValueNameTypingNoiseState[];
static const char kStatsValueNameDer[];
static const char kStatsValueNameFingerprint[];
static const char kStatsValueNameFingerprintAlgorithm[];
static const char kStatsValueNameIssuerId[];
static const char kStatsValueNameLocalCertificateId[];
static const char kStatsValueNameRemoteCertificateId[];
static const char kStatsValueNameLocalCandidateType[];
static const char kStatsValueNameRemoteCandidateType[];
static const char kStatsValueNameRecvPacketGroupArrivalTimeDebug[];
static const char kStatsValueNameRecvPacketGroupPropagationDeltaDebug[];
static const char kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug[];
static const char kStatsValueNameDecodingCTSG[];
static const char kStatsValueNameDecodingCTN[];
static const char kStatsValueNameDecodingNormal[];
static const char kStatsValueNameDecodingPLC[];
static const char kStatsValueNameDecodingCNG[];
static const char kStatsValueNameDecodingPLCCNG[];
// The id of StatsReport of type VideoBWE.
static const char kStatsReportVideoBweId[];
};
// This class is provided for the cases where we need to keep