mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Upgrade libsrt to v1.5.3. v5.0.183 v6.0.81 (#3808)
fix https://github.com/ossrs/srs/issues/3155 Build srt-1-fit fails with `standard attributes in middle of decl-specifiers` on GCC 12,Arch Linux. See https://github.com/Haivision/srt/releases/tag/v1.5.3
This commit is contained in:
parent
f9bba0a9b0
commit
c5e067fb0b
94 changed files with 5974 additions and 6273 deletions
161
trunk/3rdparty/srt-1-fit/srtcore/packet.cpp
vendored
161
trunk/3rdparty/srt-1-fit/srtcore/packet.cpp
vendored
|
@ -151,11 +151,11 @@ modified by
|
|||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// Loss List Field Coding:
|
||||
// For any consectutive lost seqeunce numbers that the differnece between
|
||||
// For any consecutive lost seqeunce numbers that the differnece between
|
||||
// the last and first is more than 1, only record the first (a) and the
|
||||
// the last (b) sequence numbers in the loss list field, and modify the
|
||||
// the first bit of a to 1.
|
||||
// For any single loss or consectutive loss less than 2 packets, use
|
||||
// For any single loss or consecutive loss less than 2 packets, use
|
||||
// the original sequence numbers in the field.
|
||||
|
||||
#include "platform_sys.h"
|
||||
|
@ -172,9 +172,12 @@ extern Logger inlog;
|
|||
}
|
||||
using namespace srt_logging;
|
||||
|
||||
namespace srt {
|
||||
|
||||
// Set up the aliases in the constructure
|
||||
srt::CPacket::CPacket()
|
||||
: m_extra_pad()
|
||||
CPacket::CPacket()
|
||||
: m_nHeader() // Silences GCC 12 warning "used uninitialized".
|
||||
, m_extra_pad()
|
||||
, m_data_owned(false)
|
||||
, m_iSeqNo((int32_t&)(m_nHeader[SRT_PH_SEQNO]))
|
||||
, m_iMsgNo((int32_t&)(m_nHeader[SRT_PH_MSGNO]))
|
||||
|
@ -194,12 +197,12 @@ srt::CPacket::CPacket()
|
|||
m_PacketVector[PV_DATA].set(NULL, 0);
|
||||
}
|
||||
|
||||
char* srt::CPacket::getData()
|
||||
char* CPacket::getData()
|
||||
{
|
||||
return (char*)m_PacketVector[PV_DATA].dataRef();
|
||||
}
|
||||
|
||||
void srt::CPacket::allocate(size_t alloc_buffer_size)
|
||||
void CPacket::allocate(size_t alloc_buffer_size)
|
||||
{
|
||||
if (m_data_owned)
|
||||
{
|
||||
|
@ -213,14 +216,15 @@ void srt::CPacket::allocate(size_t alloc_buffer_size)
|
|||
m_data_owned = true;
|
||||
}
|
||||
|
||||
void srt::CPacket::deallocate()
|
||||
void CPacket::deallocate()
|
||||
{
|
||||
if (m_data_owned)
|
||||
delete[](char*) m_PacketVector[PV_DATA].data();
|
||||
m_PacketVector[PV_DATA].set(NULL, 0);
|
||||
m_data_owned = false;
|
||||
}
|
||||
|
||||
char* srt::CPacket::release()
|
||||
char* CPacket::release()
|
||||
{
|
||||
// When not owned, release returns NULL.
|
||||
char* buffer = NULL;
|
||||
|
@ -234,31 +238,99 @@ char* srt::CPacket::release()
|
|||
return buffer;
|
||||
}
|
||||
|
||||
srt::CPacket::~CPacket()
|
||||
CPacket::~CPacket()
|
||||
{
|
||||
// PV_HEADER is always owned, PV_DATA may use a "borrowed" buffer.
|
||||
// Delete the internal buffer only if it was declared as owned.
|
||||
if (m_data_owned)
|
||||
delete[](char*) m_PacketVector[PV_DATA].data();
|
||||
deallocate();
|
||||
}
|
||||
|
||||
size_t srt::CPacket::getLength() const
|
||||
size_t CPacket::getLength() const
|
||||
{
|
||||
return m_PacketVector[PV_DATA].size();
|
||||
}
|
||||
|
||||
void srt::CPacket::setLength(size_t len)
|
||||
void CPacket::setLength(size_t len)
|
||||
{
|
||||
m_PacketVector[PV_DATA].setLength(len);
|
||||
}
|
||||
|
||||
void srt::CPacket::pack(UDTMessageType pkttype, const int32_t* lparam, void* rparam, size_t size)
|
||||
void CPacket::setLength(size_t len, size_t cap)
|
||||
{
|
||||
SRT_ASSERT(len <= cap);
|
||||
setLength(len);
|
||||
m_zCapacity = cap;
|
||||
}
|
||||
|
||||
#if ENABLE_HEAVY_LOGGING
|
||||
// Debug only
|
||||
static std::string FormatNumbers(UDTMessageType pkttype, const int32_t* lparam, void* rparam, const size_t size)
|
||||
{
|
||||
// This may be changed over time, so use special interpretation
|
||||
// only for certain types, and still display all data, no matter
|
||||
// if it is expected to provide anything or not.
|
||||
std::ostringstream out;
|
||||
|
||||
out << "ARG=";
|
||||
if (lparam)
|
||||
out << *lparam;
|
||||
else
|
||||
out << "none";
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
out << " [no data]";
|
||||
return out.str();
|
||||
}
|
||||
else if (!rparam)
|
||||
{
|
||||
out << " [ {" << size << "} ]";
|
||||
return out.str();
|
||||
}
|
||||
|
||||
bool interp_as_seq = (pkttype == UMSG_LOSSREPORT || pkttype == UMSG_DROPREQ);
|
||||
bool display_dec = (pkttype == UMSG_ACK || pkttype == UMSG_ACKACK || pkttype == UMSG_DROPREQ);
|
||||
|
||||
out << " [ ";
|
||||
|
||||
// Will be effective only for hex/oct.
|
||||
out << std::showbase;
|
||||
|
||||
const size_t size32 = size/4;
|
||||
for (size_t i = 0; i < size32; ++i)
|
||||
{
|
||||
int32_t val = ((int32_t*)rparam)[i];
|
||||
if (interp_as_seq)
|
||||
{
|
||||
if (val & LOSSDATA_SEQNO_RANGE_FIRST)
|
||||
out << "<" << (val & (~LOSSDATA_SEQNO_RANGE_FIRST)) << ">";
|
||||
else
|
||||
out << val;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!display_dec)
|
||||
{
|
||||
out << std::hex;
|
||||
out << val << "/";
|
||||
out << std::dec;
|
||||
}
|
||||
out << val;
|
||||
|
||||
}
|
||||
out << " ";
|
||||
}
|
||||
|
||||
out << "]";
|
||||
return out.str();
|
||||
}
|
||||
#endif
|
||||
|
||||
void CPacket::pack(UDTMessageType pkttype, const int32_t* lparam, void* rparam, size_t size)
|
||||
{
|
||||
// Set (bit-0 = 1) and (bit-1~15 = type)
|
||||
setControl(pkttype);
|
||||
HLOGC(inlog.Debug,
|
||||
log << "pack: type=" << MessageTypeStr(pkttype) << " ARG=" << (lparam ? Sprint(*lparam) : std::string("NULL"))
|
||||
<< " [ " << (rparam ? Sprint(*(int32_t*)rparam) : std::string()) << " ]");
|
||||
HLOGC(inlog.Debug, log << "pack: type=" << MessageTypeStr(pkttype) << " " << FormatNumbers(pkttype, lparam, rparam, size));
|
||||
|
||||
// Set additional information and control information field
|
||||
switch (pkttype)
|
||||
|
@ -364,7 +436,7 @@ void srt::CPacket::pack(UDTMessageType pkttype, const int32_t* lparam, void* rpa
|
|||
}
|
||||
}
|
||||
|
||||
void srt::CPacket::toNL()
|
||||
void CPacket::toNL()
|
||||
{
|
||||
// XXX USE HtoNLA!
|
||||
if (isControl())
|
||||
|
@ -382,7 +454,7 @@ void srt::CPacket::toNL()
|
|||
}
|
||||
}
|
||||
|
||||
void srt::CPacket::toHL()
|
||||
void CPacket::toHL()
|
||||
{
|
||||
// convert back into local host order
|
||||
uint32_t* p = m_nHeader;
|
||||
|
@ -399,22 +471,22 @@ void srt::CPacket::toHL()
|
|||
}
|
||||
}
|
||||
|
||||
srt::IOVector* srt::CPacket::getPacketVector()
|
||||
IOVector* CPacket::getPacketVector()
|
||||
{
|
||||
return m_PacketVector;
|
||||
}
|
||||
|
||||
srt::UDTMessageType srt::CPacket::getType() const
|
||||
UDTMessageType CPacket::getType() const
|
||||
{
|
||||
return UDTMessageType(SEQNO_MSGTYPE::unwrap(m_nHeader[SRT_PH_SEQNO]));
|
||||
}
|
||||
|
||||
int srt::CPacket::getExtendedType() const
|
||||
int CPacket::getExtendedType() const
|
||||
{
|
||||
return SEQNO_EXTTYPE::unwrap(m_nHeader[SRT_PH_SEQNO]);
|
||||
}
|
||||
|
||||
int32_t srt::CPacket::getAckSeqNo() const
|
||||
int32_t CPacket::getAckSeqNo() const
|
||||
{
|
||||
// read additional information field
|
||||
// This field is used only in UMSG_ACK and UMSG_ACKACK,
|
||||
|
@ -423,7 +495,7 @@ int32_t srt::CPacket::getAckSeqNo() const
|
|||
return m_nHeader[SRT_PH_MSGNO];
|
||||
}
|
||||
|
||||
uint16_t srt::CPacket::getControlFlags() const
|
||||
uint16_t CPacket::getControlFlags() const
|
||||
{
|
||||
// This returns exactly the "extended type" value,
|
||||
// which is not used at all in case when the standard
|
||||
|
@ -432,17 +504,17 @@ uint16_t srt::CPacket::getControlFlags() const
|
|||
return SEQNO_EXTTYPE::unwrap(m_nHeader[SRT_PH_SEQNO]);
|
||||
}
|
||||
|
||||
srt::PacketBoundary srt::CPacket::getMsgBoundary() const
|
||||
PacketBoundary CPacket::getMsgBoundary() const
|
||||
{
|
||||
return PacketBoundary(MSGNO_PACKET_BOUNDARY::unwrap(m_nHeader[SRT_PH_MSGNO]));
|
||||
}
|
||||
|
||||
bool srt::CPacket::getMsgOrderFlag() const
|
||||
bool CPacket::getMsgOrderFlag() const
|
||||
{
|
||||
return 0 != MSGNO_PACKET_INORDER::unwrap(m_nHeader[SRT_PH_MSGNO]);
|
||||
}
|
||||
|
||||
int32_t srt::CPacket::getMsgSeq(bool has_rexmit) const
|
||||
int32_t CPacket::getMsgSeq(bool has_rexmit) const
|
||||
{
|
||||
if (has_rexmit)
|
||||
{
|
||||
|
@ -454,13 +526,18 @@ int32_t srt::CPacket::getMsgSeq(bool has_rexmit) const
|
|||
}
|
||||
}
|
||||
|
||||
bool srt::CPacket::getRexmitFlag() const
|
||||
bool CPacket::getRexmitFlag() const
|
||||
{
|
||||
// return false; //
|
||||
return 0 != MSGNO_REXMIT::unwrap(m_nHeader[SRT_PH_MSGNO]);
|
||||
}
|
||||
|
||||
srt::EncryptionKeySpec srt::CPacket::getMsgCryptoFlags() const
|
||||
void CPacket::setRexmitFlag(bool bRexmit)
|
||||
{
|
||||
const int32_t clr_msgno = m_nHeader[SRT_PH_MSGNO] & ~MSGNO_REXMIT::mask;
|
||||
m_nHeader[SRT_PH_MSGNO] = clr_msgno | MSGNO_REXMIT::wrap(bRexmit? 1 : 0);
|
||||
}
|
||||
|
||||
EncryptionKeySpec CPacket::getMsgCryptoFlags() const
|
||||
{
|
||||
return EncryptionKeySpec(MSGNO_ENCKEYSPEC::unwrap(m_nHeader[SRT_PH_MSGNO]));
|
||||
}
|
||||
|
@ -468,32 +545,30 @@ srt::EncryptionKeySpec srt::CPacket::getMsgCryptoFlags() const
|
|||
// This is required as the encryption/decryption happens in place.
|
||||
// This is required to clear off the flags after decryption or set
|
||||
// crypto flags after encrypting a packet.
|
||||
void srt::CPacket::setMsgCryptoFlags(EncryptionKeySpec spec)
|
||||
void CPacket::setMsgCryptoFlags(EncryptionKeySpec spec)
|
||||
{
|
||||
int32_t clr_msgno = m_nHeader[SRT_PH_MSGNO] & ~MSGNO_ENCKEYSPEC::mask;
|
||||
m_nHeader[SRT_PH_MSGNO] = clr_msgno | EncryptionKeyBits(spec);
|
||||
}
|
||||
|
||||
uint32_t srt::CPacket::getMsgTimeStamp() const
|
||||
uint32_t CPacket::getMsgTimeStamp() const
|
||||
{
|
||||
// SRT_DEBUG_TSBPD_WRAP may enable smaller timestamp for faster wraparoud handling tests
|
||||
// SRT_DEBUG_TSBPD_WRAP used to enable smaller timestamps for faster testing of how wraparounds are handled
|
||||
return (uint32_t)m_nHeader[SRT_PH_TIMESTAMP] & TIMESTAMP_MASK;
|
||||
}
|
||||
|
||||
srt::CPacket* srt::CPacket::clone() const
|
||||
CPacket* CPacket::clone() const
|
||||
{
|
||||
CPacket* pkt = new CPacket;
|
||||
memcpy((pkt->m_nHeader), m_nHeader, HDR_SIZE);
|
||||
pkt->m_pcData = new char[m_PacketVector[PV_DATA].size()];
|
||||
memcpy((pkt->m_pcData), m_pcData, m_PacketVector[PV_DATA].size());
|
||||
pkt->m_PacketVector[PV_DATA].setLength(m_PacketVector[PV_DATA].size());
|
||||
pkt->allocate(this->getLength());
|
||||
SRT_ASSERT(this->getLength() == pkt->getLength());
|
||||
memcpy((pkt->m_pcData), m_pcData, this->getLength());
|
||||
pkt->m_DestAddr = m_DestAddr;
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
namespace srt
|
||||
{
|
||||
|
||||
// Useful for debugging
|
||||
std::string PacketMessageFlagStr(uint32_t msgno_field)
|
||||
{
|
||||
|
@ -522,10 +597,8 @@ inline void SprintSpecialWord(std::ostream& os, int32_t val)
|
|||
os << val;
|
||||
}
|
||||
|
||||
} // namespace srt
|
||||
|
||||
#if ENABLE_LOGGING
|
||||
std::string srt::CPacket::Info()
|
||||
std::string CPacket::Info()
|
||||
{
|
||||
std::ostringstream os;
|
||||
os << "TARGET=@" << m_iID << " ";
|
||||
|
@ -580,3 +653,5 @@ std::string srt::CPacket::Info()
|
|||
return os.str();
|
||||
}
|
||||
#endif
|
||||
|
||||
} // end namespace srt
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue