修复rtp padding flag可能导致的bug
This commit is contained in:
parent
8453f822b0
commit
8ba4c97286
|
|
@ -45,31 +45,46 @@ RtpReceiver::~RtpReceiver() {}
|
||||||
|
|
||||||
bool RtpReceiver::handleOneRtp(int track_index,SdpTrack::Ptr &track, unsigned char *rtp_raw_ptr, unsigned int rtp_raw_len) {
|
bool RtpReceiver::handleOneRtp(int track_index,SdpTrack::Ptr &track, unsigned char *rtp_raw_ptr, unsigned int rtp_raw_len) {
|
||||||
if(rtp_raw_len < 12){
|
if(rtp_raw_len < 12){
|
||||||
|
WarnL << "rtp包太小:" << rtp_raw_len;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t padding = 0;
|
||||||
|
if (rtp_raw_ptr[0] & 0x40) {
|
||||||
|
//获取padding大小
|
||||||
|
padding = rtp_raw_ptr[rtp_raw_len - 1];
|
||||||
|
//移除padding flag
|
||||||
|
rtp_raw_ptr[0] &= ~0x40;
|
||||||
|
//移除padding字节
|
||||||
|
rtp_raw_len -= padding;
|
||||||
|
}
|
||||||
|
|
||||||
auto rtp_ptr = _rtp_pool.obtain();
|
auto rtp_ptr = _rtp_pool.obtain();
|
||||||
auto &rtp = *rtp_ptr;
|
auto &rtp = *rtp_ptr;
|
||||||
auto length = rtp_raw_len + 4;
|
|
||||||
|
|
||||||
|
rtp.type = track->_type;
|
||||||
rtp.interleaved = 2 * track->_type;
|
rtp.interleaved = 2 * track->_type;
|
||||||
rtp.mark = rtp_raw_ptr[1] >> 7;
|
rtp.mark = rtp_raw_ptr[1] >> 7;
|
||||||
rtp.PT = rtp_raw_ptr[1] & 0x7F;
|
rtp.PT = rtp_raw_ptr[1] & 0x7F;
|
||||||
//序列号
|
|
||||||
memcpy(&rtp.sequence,rtp_raw_ptr+2,2);//内存对齐
|
//序列号,内存对齐
|
||||||
|
memcpy(&rtp.sequence, rtp_raw_ptr + 2, 2);
|
||||||
rtp.sequence = ntohs(rtp.sequence);
|
rtp.sequence = ntohs(rtp.sequence);
|
||||||
//时间戳
|
|
||||||
memcpy(&rtp.timeStamp, rtp_raw_ptr+4, 4);//内存对齐
|
//时间戳,内存对齐
|
||||||
|
memcpy(&rtp.timeStamp, rtp_raw_ptr + 4, 4);
|
||||||
|
rtp.timeStamp = ntohl(rtp.timeStamp);
|
||||||
|
|
||||||
if(!track->_samplerate){
|
if(!track->_samplerate){
|
||||||
//无法把时间戳转换成毫秒
|
//无法把时间戳转换成毫秒
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//时间戳转换成毫秒
|
//时间戳转换成毫秒
|
||||||
rtp.timeStamp = ntohl(rtp.timeStamp) * 1000LL / track->_samplerate;
|
rtp.timeStamp = rtp.timeStamp * 1000LL / track->_samplerate;
|
||||||
//ssrc
|
|
||||||
memcpy(&rtp.ssrc,rtp_raw_ptr+8,4);//内存对齐
|
//ssrc,内存对齐
|
||||||
|
memcpy(&rtp.ssrc, rtp_raw_ptr + 8, 4);
|
||||||
rtp.ssrc = ntohl(rtp.ssrc);
|
rtp.ssrc = ntohl(rtp.ssrc);
|
||||||
rtp.type = track->_type;
|
|
||||||
|
|
||||||
if (track->_ssrc != rtp.ssrc) {
|
if (track->_ssrc != rtp.ssrc) {
|
||||||
if (track->_ssrc == 0) {
|
if (track->_ssrc == 0) {
|
||||||
|
|
@ -102,24 +117,19 @@ bool RtpReceiver::handleOneRtp(int track_index,SdpTrack::Ptr &track, unsigned ch
|
||||||
rtp.offset += ext;
|
rtp.offset += ext;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(length <= rtp.offset){
|
if(rtp_raw_len <= rtp.offset){
|
||||||
WarnL << "无有效负载的rtp包:" << length << "<=" << (int)rtp.offset;
|
WarnL << "无有效负载的rtp包:" << rtp_raw_len << " <= " << (int)rtp.offset;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(length > RTP_MAX_SIZE){
|
if(rtp_raw_len > RTP_MAX_SIZE){
|
||||||
WarnL << "超大的rtp包:" << length << ">" << RTP_MAX_SIZE;
|
WarnL << "超大的rtp包:" << rtp_raw_len << " > " << RTP_MAX_SIZE;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t padding = 0;
|
|
||||||
if(rtp_raw_ptr[0] & 0x40){
|
|
||||||
padding = rtp_raw_ptr[rtp_raw_len - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//设置rtp负载长度
|
//设置rtp负载长度
|
||||||
rtp.setCapacity(length);
|
rtp.setCapacity(rtp_raw_len + 4);
|
||||||
rtp.setSize(length - padding);
|
rtp.setSize(rtp_raw_len + 4);
|
||||||
uint8_t *payload_ptr = (uint8_t *)rtp.data();
|
uint8_t *payload_ptr = (uint8_t *)rtp.data();
|
||||||
payload_ptr[0] = '$';
|
payload_ptr[0] = '$';
|
||||||
payload_ptr[1] = rtp.interleaved;
|
payload_ptr[1] = rtp.interleaved;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue