mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
221 lines
5.2 KiB
C++
221 lines
5.2 KiB
C++
/*
|
|
* SRT - Secure, Reliable, Transport
|
|
* Copyright (c) 2021 Haivision Systems Inc.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
*/
|
|
|
|
#ifndef INC_SRT_STATS_H
|
|
#define INC_SRT_STATS_H
|
|
|
|
#include "platform_sys.h"
|
|
#include "packet.h"
|
|
|
|
namespace srt
|
|
{
|
|
namespace stats
|
|
{
|
|
|
|
class Packets
|
|
{
|
|
public:
|
|
Packets() : m_count(0) {}
|
|
|
|
Packets(uint32_t num) : m_count(num) {}
|
|
|
|
void reset()
|
|
{
|
|
m_count = 0;
|
|
}
|
|
|
|
Packets& operator+= (const Packets& other)
|
|
{
|
|
m_count += other.m_count;
|
|
return *this;
|
|
}
|
|
|
|
uint32_t count() const
|
|
{
|
|
return m_count;
|
|
}
|
|
|
|
private:
|
|
uint32_t m_count;
|
|
};
|
|
|
|
class BytesPackets
|
|
{
|
|
public:
|
|
BytesPackets()
|
|
: m_bytes(0)
|
|
, m_packets(0)
|
|
{}
|
|
|
|
BytesPackets(uint64_t bytes, uint32_t n = 1)
|
|
: m_bytes(bytes)
|
|
, m_packets(n)
|
|
{}
|
|
|
|
BytesPackets& operator+= (const BytesPackets& other)
|
|
{
|
|
m_bytes += other.m_bytes;
|
|
m_packets += other.m_packets;
|
|
return *this;
|
|
}
|
|
|
|
public:
|
|
void reset()
|
|
{
|
|
m_packets = 0;
|
|
m_bytes = 0;
|
|
}
|
|
|
|
void count(uint64_t bytes, size_t n = 1)
|
|
{
|
|
m_packets += (uint32_t) n;
|
|
m_bytes += bytes;
|
|
}
|
|
|
|
uint64_t bytes() const
|
|
{
|
|
return m_bytes;
|
|
}
|
|
|
|
uint32_t count() const
|
|
{
|
|
return m_packets;
|
|
}
|
|
|
|
uint64_t bytesWithHdr() const
|
|
{
|
|
return m_bytes + m_packets * CPacket::SRT_DATA_HDR_SIZE;
|
|
}
|
|
|
|
private:
|
|
uint64_t m_bytes;
|
|
uint32_t m_packets;
|
|
};
|
|
|
|
template <class METRIC_TYPE>
|
|
struct Metric
|
|
{
|
|
METRIC_TYPE trace;
|
|
METRIC_TYPE total;
|
|
|
|
void count(METRIC_TYPE val)
|
|
{
|
|
trace += val;
|
|
total += val;
|
|
}
|
|
|
|
void reset()
|
|
{
|
|
trace.reset();
|
|
total.reset();
|
|
}
|
|
|
|
void resetTrace()
|
|
{
|
|
trace.reset();
|
|
}
|
|
};
|
|
|
|
/// Sender-side statistics.
|
|
struct Sender
|
|
{
|
|
Metric<BytesPackets> sent;
|
|
Metric<BytesPackets> sentUnique;
|
|
Metric<BytesPackets> sentRetrans; // The number of data packets retransmitted by the sender.
|
|
Metric<Packets> lost; // The number of packets reported lost (including repeated reports) to the sender in NAKs.
|
|
Metric<BytesPackets> dropped; // The number of data packets dropped by the sender.
|
|
|
|
Metric<Packets> sentFilterExtra; // The number of packets generate by the packet filter and sent by the sender.
|
|
|
|
Metric<Packets> recvdAck; // The number of ACK packets received by the sender.
|
|
Metric<Packets> recvdNak; // The number of ACK packets received by the sender.
|
|
|
|
void reset()
|
|
{
|
|
sent.reset();
|
|
sentUnique.reset();
|
|
sentRetrans.reset();
|
|
lost.reset();
|
|
dropped.reset();
|
|
recvdAck.reset();
|
|
recvdNak.reset();
|
|
sentFilterExtra.reset();
|
|
}
|
|
|
|
void resetTrace()
|
|
{
|
|
sent.resetTrace();
|
|
sentUnique.resetTrace();
|
|
sentRetrans.resetTrace();
|
|
lost.resetTrace();
|
|
dropped.resetTrace();
|
|
recvdAck.resetTrace();
|
|
recvdNak.resetTrace();
|
|
sentFilterExtra.resetTrace();
|
|
}
|
|
};
|
|
|
|
/// Receiver-side statistics.
|
|
struct Receiver
|
|
{
|
|
Metric<BytesPackets> recvd;
|
|
Metric<BytesPackets> recvdUnique;
|
|
Metric<BytesPackets> recvdRetrans; // The number of retransmitted data packets received by the receiver.
|
|
Metric<BytesPackets> lost; // The number of packets detected by the receiver as lost.
|
|
Metric<BytesPackets> dropped; // The number of packets dropped by the receiver (as too-late to be delivered).
|
|
Metric<BytesPackets> recvdBelated; // The number of belated packets received (dropped as too late but eventually received).
|
|
Metric<BytesPackets> undecrypted; // The number of packets received by the receiver that failed to be decrypted.
|
|
|
|
Metric<Packets> recvdFilterExtra; // The number of filter packets (e.g. FEC) received by the receiver.
|
|
Metric<Packets> suppliedByFilter; // The number of lost packets got from the packet filter at the receiver side (e.g. loss recovered by FEC).
|
|
Metric<Packets> lossFilter; // The number of lost DATA packets not recovered by the packet filter at the receiver side.
|
|
|
|
Metric<Packets> sentAck; // The number of ACK packets sent by the receiver.
|
|
Metric<Packets> sentNak; // The number of NACK packets sent by the receiver.
|
|
|
|
void reset()
|
|
{
|
|
recvd.reset();
|
|
recvdUnique.reset();
|
|
recvdRetrans.reset();
|
|
lost.reset();
|
|
dropped.reset();
|
|
recvdBelated.reset();
|
|
undecrypted.reset();
|
|
recvdFilterExtra.reset();
|
|
suppliedByFilter.reset();
|
|
lossFilter.reset();
|
|
sentAck.reset();
|
|
sentNak.reset();
|
|
}
|
|
|
|
void resetTrace()
|
|
{
|
|
recvd.resetTrace();
|
|
recvdUnique.resetTrace();
|
|
recvdRetrans.resetTrace();
|
|
lost.resetTrace();
|
|
dropped.resetTrace();
|
|
recvdBelated.resetTrace();
|
|
undecrypted.resetTrace();
|
|
recvdFilterExtra.resetTrace();
|
|
suppliedByFilter.resetTrace();
|
|
lossFilter.resetTrace();
|
|
sentAck.resetTrace();
|
|
sentNak.resetTrace();
|
|
}
|
|
};
|
|
|
|
} // namespace stats
|
|
} // namespace srt
|
|
|
|
#endif // INC_SRT_STATS_H
|
|
|
|
|