mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-24 01:42:22 +08:00
重写rtp框架
This commit is contained in:
@@ -415,14 +415,101 @@ string printSSRC(uint32_t ui32Ssrc) {
|
||||
}
|
||||
|
||||
Buffer::Ptr makeRtpOverTcpPrefix(uint16_t size, uint8_t interleaved){
|
||||
auto rtp_tcp = std::make_shared<BufferRaw>(4);
|
||||
auto rtp_tcp = std::make_shared<BufferRaw>(RtpPacket::kRtpTcpHeaderSize);
|
||||
rtp_tcp->setSize(RtpPacket::kRtpTcpHeaderSize);
|
||||
auto ptr = rtp_tcp->data();
|
||||
ptr[0] = '$';
|
||||
ptr[1] = interleaved;
|
||||
ptr[2] = (size >> 8) & 0xFF;
|
||||
ptr[3] = size & 0xFF;
|
||||
rtp_tcp->setSize(4);
|
||||
return rtp_tcp;
|
||||
}
|
||||
|
||||
#define AV_RB16(x) \
|
||||
((((const uint8_t*)(x))[0] << 8) | \
|
||||
((const uint8_t*)(x))[1])
|
||||
|
||||
size_t RtpHeader::getCsrcSize() const {
|
||||
//每个csrc占用4字节
|
||||
return csrc << 2;
|
||||
}
|
||||
|
||||
uint8_t *RtpHeader::getCsrcData() {
|
||||
if (!csrc) {
|
||||
return nullptr;
|
||||
}
|
||||
return &payload;
|
||||
}
|
||||
|
||||
size_t RtpHeader::getExtSize() const {
|
||||
//rtp有ext
|
||||
if (!ext) {
|
||||
return 0;
|
||||
}
|
||||
auto ext_ptr = &payload + getCsrcSize();
|
||||
uint16_t reserved = AV_RB16(ext_ptr);
|
||||
//每个ext占用4字节
|
||||
return AV_RB16(ext_ptr + 2) << 2;
|
||||
}
|
||||
|
||||
uint8_t *RtpHeader::getExtData() {
|
||||
if (!ext) {
|
||||
return nullptr;
|
||||
}
|
||||
auto ext_ptr = &payload + getCsrcSize();
|
||||
//多出的4个字节分别为reserved、ext_len
|
||||
return ext_ptr + 4 + getExtSize();
|
||||
}
|
||||
|
||||
size_t RtpHeader::getPayloadOffset() const {
|
||||
//有ext时,还需要忽略reserved、ext_len 4个字节
|
||||
return getCsrcSize() + (ext ? (4 + getExtSize()) : 0);
|
||||
}
|
||||
|
||||
uint8_t *RtpHeader::getPayloadData() {
|
||||
return &payload + getPayloadOffset();
|
||||
}
|
||||
|
||||
size_t RtpHeader::getPaddingSize(size_t rtp_size) const {
|
||||
if (!padding) {
|
||||
return 0;
|
||||
}
|
||||
auto end = (uint8_t *) this + rtp_size;
|
||||
return *end;
|
||||
}
|
||||
|
||||
size_t RtpHeader::getPayloadSize(size_t rtp_size){
|
||||
auto invalid_size = getPayloadOffset() + getPaddingSize(rtp_size);
|
||||
if (invalid_size + RtpPacket::kRtpHeaderSize >= rtp_size) {
|
||||
return 0;
|
||||
}
|
||||
return rtp_size - invalid_size - RtpPacket::kRtpHeaderSize;
|
||||
}
|
||||
|
||||
RtpHeader* RtpPacket::getHeader(){
|
||||
//需除去rtcp over tcp 4个字节长度
|
||||
return (RtpHeader*)(data() + RtpPacket::kRtpTcpHeaderSize);
|
||||
}
|
||||
|
||||
uint16_t RtpPacket::getSeq(){
|
||||
return ntohs(getHeader()->seq);
|
||||
}
|
||||
|
||||
uint32_t RtpPacket::getStampMS(){
|
||||
return ntohl(getHeader()->stamp) * uint64_t(1000) / sample_rate;
|
||||
}
|
||||
|
||||
uint32_t RtpPacket::getSSRC(){
|
||||
return ntohl(getHeader()->ssrc);
|
||||
}
|
||||
|
||||
uint8_t* RtpPacket::getPayload(){
|
||||
return getHeader()->getPayloadData();
|
||||
}
|
||||
|
||||
size_t RtpPacket::getPayloadSize(){
|
||||
//需除去rtcp over tcp 4个字节长度
|
||||
return getHeader()->getPayloadSize(size() - kRtpTcpHeaderSize);
|
||||
}
|
||||
|
||||
}//namespace mediakit
|
||||
Reference in New Issue
Block a user