mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +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
 | 
						|
 | 
						|
 |