ZLMediaKit/src/Rtcp/RtcpContext.h

140 lines
3.8 KiB
C++
Raw Normal View History

2021-01-31 20:46:55 +08:00
/*
2021-01-31 19:18:17 +08:00
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
*
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
*
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree. All contributing project authors
* may be found in the AUTHORS file in the root of the source tree.
*/
#ifndef ZLMEDIAKIT_RTCPCONTEXT_H
#define ZLMEDIAKIT_RTCPCONTEXT_H
#include <stdint.h>
#include <stddef.h>
#include "Rtcp.h"
namespace mediakit {
class RtcpContext {
public:
using Ptr = std::shared_ptr<RtcpContext>;
virtual ~RtcpContext() = default;
2021-01-31 19:18:17 +08:00
/**
* rtp时调用
* @param seq rtp的seq
* @param stamp rtp的时间戳()
* @param ntp_stamp_ms ntp时间戳
* @param rtp rtp时间戳采样率90000
2021-01-31 19:18:17 +08:00
* @param bytes rtp数据长度
*/
virtual void onRtp(uint16_t seq, uint32_t stamp, uint64_t ntp_stamp_ms, uint32_t sample_rate, size_t bytes);
2021-01-31 19:18:17 +08:00
/**
* sr rtcp包
* @param rtcp rtcp
*/
2021-10-13 20:28:10 +08:00
virtual void onRtcp(RtcpHeader *rtcp) = 0;
2021-01-31 19:18:17 +08:00
/**
*
*/
virtual size_t getLost();
2021-01-31 19:18:17 +08:00
/**
* rtp数
*/
virtual size_t getExpectedPackets() const;
2021-01-31 19:18:17 +08:00
/**
* SR rtcp包
* @param rtcp_ssrc rtcp的ssrc
* @return rtcp包
*/
virtual Buffer::Ptr createRtcpSR(uint32_t rtcp_ssrc);
2021-01-31 19:18:17 +08:00
/**
* RR rtcp包
* @param rtcp_ssrc rtcp的ssrc
* @param rtp_ssrc rtp的ssrc
* @return rtcp包
*/
virtual Buffer::Ptr createRtcpRR(uint32_t rtcp_ssrc, uint32_t rtp_ssrc);
2021-01-31 19:18:17 +08:00
/**
*
*/
2021-10-13 17:57:52 +08:00
virtual size_t getExpectedPacketsInterval();
2021-01-31 19:18:17 +08:00
/**
*
*/
2021-10-13 17:57:52 +08:00
virtual size_t geLostInterval();
2021-01-31 19:18:17 +08:00
protected:
2021-01-31 19:18:17 +08:00
//收到或发送的rtp的字节数
size_t _bytes = 0;
//收到或发送的rtp的个数
size_t _packets = 0;
//上次的rtp时间戳,毫秒
uint32_t _last_rtp_stamp = 0;
uint64_t _last_ntp_stamp_ms = 0;
2021-01-31 19:18:17 +08:00
};
class RtcpContextForSend : public RtcpContext {
public:
Buffer::Ptr createRtcpSR(uint32_t rtcp_ssrc) override;
2021-10-13 20:28:10 +08:00
void onRtcp(RtcpHeader *rtcp) override;
/**
* rtt
* @param ssrc rtp ssrc
* @return rtt,
*/
uint32_t getRtt(uint32_t ssrc) const;
private:
map<uint32_t/*ssrc*/, uint32_t/*rtt*/> _rtt;
map<uint32_t/*last_sr_lsr*/, uint64_t/*ntp stamp*/> _sender_report_ntp;
};
class RtcpContextForRecv : public RtcpContext {
2021-10-13 20:28:10 +08:00
public:
void onRtp(uint16_t seq, uint32_t stamp, uint64_t ntp_stamp_ms, uint32_t sample_rate, size_t bytes) override;
Buffer::Ptr createRtcpRR(uint32_t rtcp_ssrc, uint32_t rtp_ssrc) override;
size_t getExpectedPackets() const override;
size_t getExpectedPacketsInterval() override;
size_t getLost() override;
size_t geLostInterval() override;
void onRtcp(RtcpHeader *rtcp) override;
private:
2021-10-13 15:20:03 +08:00
//时间戳抖动值
double _jitter = 0;
//第一个seq的值
uint16_t _seq_base = 0;
//rtp最大seq
uint16_t _seq_max = 0;
//rtp回环次数
uint16_t _seq_cycles = 0;
//上次回环发生时记录的rtp包数
size_t _last_cycle_packets = 0;
//上次的seq
uint16_t _last_rtp_seq = 0;
//上次的rtp的系统时间戳(毫秒)用于统计抖动
uint64_t _last_rtp_sys_stamp = 0;
2021-10-13 20:28:10 +08:00
//上次统计的丢包总数
size_t _last_lost = 0;
//上次统计应收rtp包总数
size_t _last_expected = 0;
//上次收到sr包时计算出的Last SR timestamp
uint32_t _last_sr_lsr = 0;
//上次收到sr时的系统时间戳,单位毫秒
uint64_t _last_sr_ntp_sys = 0;
};
2021-10-13 20:28:10 +08:00
2021-01-31 19:18:17 +08:00
}//namespace mediakit
#endif //ZLMEDIAKIT_RTCPCONTEXT_H