2022-06-03 13:25:32 +08:00
|
|
|
|
#ifndef ZLMEDIAKIT_SRT_COMMON_H
|
|
|
|
|
#define ZLMEDIAKIT_SRT_COMMON_H
|
2022-06-06 20:40:04 +08:00
|
|
|
|
#if defined(_WIN32)
|
|
|
|
|
#include <winsock2.h>
|
|
|
|
|
#include <ws2tcpip.h>
|
2022-06-09 22:54:24 +08:00
|
|
|
|
|
|
|
|
|
#include <Iphlpapi.h>
|
2022-06-09 19:30:03 +08:00
|
|
|
|
#pragma comment(lib, "Ws2_32.lib")
|
|
|
|
|
#pragma comment(lib, "Iphlpapi.lib")
|
2022-06-06 20:40:04 +08:00
|
|
|
|
#else
|
|
|
|
|
#include <netdb.h>
|
|
|
|
|
#include <sys/socket.h>
|
|
|
|
|
#endif // defined(_WIN32)
|
|
|
|
|
|
2022-06-03 13:25:32 +08:00
|
|
|
|
#include <chrono>
|
2022-09-22 00:34:42 +08:00
|
|
|
|
#define MAX_SEQ 0x7fffffff
|
|
|
|
|
#define SEQ_NONE 0xffffffff
|
|
|
|
|
#define MAX_TS 0xffffffff
|
2022-06-03 13:25:32 +08:00
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
namespace SRT {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
using SteadyClock = std::chrono::steady_clock;
|
|
|
|
|
using TimePoint = std::chrono::time_point<SteadyClock>;
|
|
|
|
|
|
|
|
|
|
using Microseconds = std::chrono::microseconds;
|
|
|
|
|
using Milliseconds = std::chrono::milliseconds;
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline int64_t DurationCountMicroseconds(SteadyClock::duration dur) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
return std::chrono::duration_cast<std::chrono::microseconds>(dur).count();
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline uint32_t loadUint32(uint8_t *ptr) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
return ptr[0] << 24 | ptr[1] << 16 | ptr[2] << 8 | ptr[3];
|
|
|
|
|
}
|
2022-06-07 09:52:20 +08:00
|
|
|
|
|
|
|
|
|
static inline uint16_t loadUint16(uint8_t *ptr) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
return ptr[0] << 8 | ptr[1];
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-22 00:34:42 +08:00
|
|
|
|
inline static int64_t seqCmp(uint32_t seq1, uint32_t seq2) {
|
|
|
|
|
if(seq1 > seq2){
|
|
|
|
|
if((seq1 - seq2) >(MAX_SEQ>>1)){
|
|
|
|
|
return (int64_t)seq1 - (int64_t)(seq2+MAX_SEQ);
|
|
|
|
|
}else{
|
|
|
|
|
return (int64_t)seq1 - (int64_t)seq2;
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
if((seq2-seq1) >(MAX_SEQ>>1)){
|
|
|
|
|
return (int64_t)(seq1+MAX_SEQ) - (int64_t)seq2;
|
|
|
|
|
}else{
|
|
|
|
|
return (int64_t)seq1 - (int64_t)seq2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline static uint32_t incSeq(int32_t seq) {
|
|
|
|
|
return (seq == MAX_SEQ) ? 0 : seq + 1;
|
|
|
|
|
}
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline void storeUint32(uint8_t *buf, uint32_t val) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
buf[0] = val >> 24;
|
|
|
|
|
buf[1] = (val >> 16) & 0xff;
|
|
|
|
|
buf[2] = (val >> 8) & 0xff;
|
|
|
|
|
buf[3] = val & 0xff;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline void storeUint16(uint8_t *buf, uint16_t val) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
buf[0] = (val >> 8) & 0xff;
|
|
|
|
|
buf[1] = val & 0xff;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline void storeUint32LE(uint8_t *buf, uint32_t val) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
buf[0] = val & 0xff;
|
|
|
|
|
buf[1] = (val >> 8) & 0xff;
|
|
|
|
|
buf[2] = (val >> 16) & 0xff;
|
2022-06-07 09:52:20 +08:00
|
|
|
|
buf[3] = (val >> 24) & 0xff;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline void storeUint16LE(uint8_t *buf, uint16_t val) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
buf[0] = val & 0xff;
|
2022-06-07 09:52:20 +08:00
|
|
|
|
buf[1] = (val >> 8) & 0xff;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
static inline uint32_t srtVersion(int major, int minor, int patch) {
|
|
|
|
|
return patch + minor * 0x100 + major * 0x10000;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
2022-06-09 19:30:03 +08:00
|
|
|
|
static inline uint32_t genExpectedSeq(uint32_t seq) {
|
|
|
|
|
return MAX_SEQ & seq;
|
|
|
|
|
}
|
2022-06-03 20:18:34 +08:00
|
|
|
|
|
|
|
|
|
class UTicker {
|
|
|
|
|
public:
|
2022-06-07 09:52:20 +08:00
|
|
|
|
UTicker() { _created = _begin = SteadyClock::now(); }
|
|
|
|
|
~UTicker() = default;
|
2022-06-03 20:18:34 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取创建时间,单位微妙
|
|
|
|
|
*/
|
2022-06-07 09:52:20 +08:00
|
|
|
|
int64_t elapsedTime(TimePoint now) const { return DurationCountMicroseconds(now - _begin); }
|
2022-06-03 20:18:34 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取上次resetTime后至今的时间,单位毫秒
|
|
|
|
|
*/
|
2022-06-07 09:52:20 +08:00
|
|
|
|
int64_t createdTime(TimePoint now) const { return DurationCountMicroseconds(now - _created); }
|
2022-06-03 20:18:34 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重置计时器
|
|
|
|
|
*/
|
2022-06-07 09:52:20 +08:00
|
|
|
|
void resetTime(TimePoint now) { _begin = now; }
|
2022-06-03 20:18:34 +08:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
TimePoint _begin;
|
|
|
|
|
TimePoint _created;
|
|
|
|
|
};
|
|
|
|
|
|
2022-06-03 13:25:32 +08:00
|
|
|
|
} // namespace SRT
|
|
|
|
|
|
2022-06-07 09:52:20 +08:00
|
|
|
|
#endif // ZLMEDIAKIT_SRT_COMMON_H
|