mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-07 04:08:13 +08:00
支持超大rtp包
This commit is contained in:
@@ -45,9 +45,9 @@ RtpReceiver::~RtpReceiver() {}
|
||||
bool RtpReceiver::handleOneRtp(int iTrackidx,SdpTrack::Ptr &track, unsigned char *pucData, unsigned int uiLen) {
|
||||
auto pt_ptr=_pktPool.obtain();
|
||||
auto &rtppt=*pt_ptr;
|
||||
rtppt.interleaved = track->_interleaved;
|
||||
rtppt.length = uiLen + 4;
|
||||
auto length = uiLen + 4;
|
||||
|
||||
rtppt.interleaved = track->_interleaved;
|
||||
rtppt.mark = pucData[1] >> 7;
|
||||
rtppt.PT = pucData[1] & 0x7F;
|
||||
//序列号
|
||||
@@ -81,12 +81,8 @@ bool RtpReceiver::handleOneRtp(int iTrackidx,SdpTrack::Ptr &track, unsigned char
|
||||
}
|
||||
_aui32SsrcErrorCnt[iTrackidx] = 0;
|
||||
|
||||
rtppt.payload[0] = '$';
|
||||
rtppt.payload[1] = rtppt.interleaved;
|
||||
rtppt.payload[2] = uiLen >> 8;
|
||||
rtppt.payload[3] = (uiLen & 0x00FF);
|
||||
|
||||
rtppt.offset = 16;
|
||||
//获取rtp中媒体数据偏移量
|
||||
rtppt.offset = 12 + 4;
|
||||
int csrc = pucData[0] & 0x0f;
|
||||
int ext = pucData[0] & 0x10;
|
||||
rtppt.offset += 4 * csrc;
|
||||
@@ -99,16 +95,20 @@ bool RtpReceiver::handleOneRtp(int iTrackidx,SdpTrack::Ptr &track, unsigned char
|
||||
rtppt.offset += ext;
|
||||
}
|
||||
|
||||
if(rtppt.length - rtppt.offset <= 0){
|
||||
WarnL << "无有效负载的rtp包:" << rtppt.length << "<=" << (int)rtppt.offset;
|
||||
if(length - rtppt.offset <= 0){
|
||||
WarnL << "无有效负载的rtp包:" << length << "<=" << (int)rtppt.offset;
|
||||
return false;
|
||||
}
|
||||
|
||||
if(uiLen > sizeof(rtppt.payload) - 4){
|
||||
WarnL << "超长的rtp包:" << uiLen << ">" << sizeof(rtppt.payload) - 4;
|
||||
return false;
|
||||
}
|
||||
memcpy(rtppt.payload + 4, pucData, uiLen);
|
||||
rtppt.setCapacity(length);
|
||||
rtppt.setSize(length);
|
||||
uint8_t *payload_ptr = (uint8_t *)rtppt.data();
|
||||
payload_ptr[0] = '$';
|
||||
payload_ptr[1] = rtppt.interleaved;
|
||||
payload_ptr[2] = uiLen >> 8;
|
||||
payload_ptr[3] = (uiLen & 0x00FF);
|
||||
//拷贝rtp负载
|
||||
memcpy(payload_ptr + 4, pucData, uiLen);
|
||||
|
||||
/////////////////////////////////RTP排序逻辑///////////////////////////////////
|
||||
if(rtppt.sequence != _aui16LastSeq[iTrackidx] + 1 && _aui16LastSeq[iTrackidx] != 0){
|
||||
|
||||
@@ -732,7 +732,7 @@ void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &pkt, const SdpTrack::Ptr &tra
|
||||
//send rtcp every 5 second
|
||||
counter.lastTimeStamp = counter.timeStamp;
|
||||
//直接保存网络字节序
|
||||
memcpy(&counter.timeStamp, pkt->payload + 8 , 4);
|
||||
memcpy(&counter.timeStamp, pkt->data() + 8 , 4);
|
||||
if(counter.lastTimeStamp != 0){
|
||||
sendReceiverReport(_eType == Rtsp::RTP_TCP,iTrackIndex);
|
||||
ticker.resetTime();
|
||||
|
||||
@@ -57,10 +57,10 @@ public:
|
||||
virtual ~BufferRtp(){}
|
||||
|
||||
char *data() const override {
|
||||
return (char *)_rtp->payload + _offset;
|
||||
return (char *)_rtp->data() + _offset;
|
||||
}
|
||||
uint32_t size() const override {
|
||||
return _rtp->length - _offset;
|
||||
return _rtp->size() - _offset;
|
||||
}
|
||||
private:
|
||||
RtpPacket::Ptr _rtp;
|
||||
|
||||
Reference in New Issue
Block a user