mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-30 23:02:24 +08:00
完善对rtp负载为空处理逻辑:#1661
This commit is contained in:
@@ -80,11 +80,17 @@ void AACRtpDecoder::obtainFrame() {
|
||||
}
|
||||
|
||||
bool AACRtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool key_pos) {
|
||||
auto payload_size = rtp->getPayloadSize();
|
||||
if (payload_size <= 0) {
|
||||
//无实际负载
|
||||
return false;
|
||||
}
|
||||
|
||||
auto stamp = rtp->getStampMS();
|
||||
//rtp数据开始部分
|
||||
auto ptr = rtp->getPayload();
|
||||
//rtp数据末尾
|
||||
auto end = ptr + rtp->getPayloadSize();
|
||||
auto end = ptr + payload_size;
|
||||
//首2字节表示Au-Header的个数,单位bit,所以除以16得到Au-Header个数
|
||||
auto au_header_count = ((ptr[0] << 8) | ptr[1]) >> 4;
|
||||
//记录au_header起始指针
|
||||
|
||||
@@ -28,14 +28,14 @@ void CommonRtpDecoder::obtainFrame() {
|
||||
}
|
||||
|
||||
bool CommonRtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool){
|
||||
auto payload = rtp->getPayload();
|
||||
auto size = rtp->getPayloadSize();
|
||||
auto stamp = rtp->getStampMS();
|
||||
auto seq = rtp->getSeq();
|
||||
if (size <= 0) {
|
||||
auto payload_size = rtp->getPayloadSize();
|
||||
if (payload_size <= 0) {
|
||||
//无实际负载
|
||||
return false;
|
||||
}
|
||||
auto payload = rtp->getPayload();
|
||||
auto stamp = rtp->getStampMS();
|
||||
auto seq = rtp->getSeq();
|
||||
|
||||
if (_frame->_dts != stamp || _frame->_buffer.size() > _max_frame_size) {
|
||||
//时间戳发生变化或者缓存超过MAX_FRAME_SIZE,则清空上帧数据
|
||||
@@ -56,7 +56,7 @@ bool CommonRtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool){
|
||||
}
|
||||
|
||||
if (!_drop_flag) {
|
||||
_frame->_buffer.append((char *)payload, size);
|
||||
_frame->_buffer.append((char *)payload, payload_size);
|
||||
}
|
||||
|
||||
_last_seq = seq;
|
||||
|
||||
@@ -141,8 +141,12 @@ bool H264RtpDecoder::mergeFu(const RtpPacket::Ptr &rtp, const uint8_t *ptr, ssiz
|
||||
}
|
||||
|
||||
bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtp) {
|
||||
auto payload_size = rtp->getPayloadSize();
|
||||
if (payload_size <= 0) {
|
||||
//无实际负载
|
||||
return false;
|
||||
}
|
||||
auto frame = rtp->getPayload();
|
||||
auto length = rtp->getPayloadSize();
|
||||
auto stamp = rtp->getStampMS();
|
||||
auto seq = rtp->getSeq();
|
||||
int nal = H264_TYPE(frame[0]);
|
||||
@@ -150,16 +154,16 @@ bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtp) {
|
||||
switch (nal) {
|
||||
case 24:
|
||||
// 24 STAP-A Single-time aggregation packet 5.7.1
|
||||
return unpackStapA(rtp, frame + 1, length - 1, stamp);
|
||||
return unpackStapA(rtp, frame + 1, payload_size - 1, stamp);
|
||||
|
||||
case 28:
|
||||
// 28 FU-A Fragmentation unit
|
||||
return mergeFu(rtp, frame, length, stamp, seq);
|
||||
return mergeFu(rtp, frame, payload_size, stamp, seq);
|
||||
|
||||
default: {
|
||||
if (nal < 24) {
|
||||
//Single NAL Unit Packets
|
||||
return singleFrame(rtp, frame, length, stamp);
|
||||
return singleFrame(rtp, frame, payload_size, stamp);
|
||||
}
|
||||
_gop_dropped = true;
|
||||
WarnL << "不支持该类型的264 RTP包, nal type:" << nal << ", rtp:\r\n" << rtp->dumpString();
|
||||
|
||||
@@ -185,8 +185,12 @@ bool H265RtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool) {
|
||||
}
|
||||
|
||||
bool H265RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtp) {
|
||||
auto payload_size = rtp->getPayloadSize();
|
||||
if (payload_size <= 0) {
|
||||
//无实际负载
|
||||
return false;
|
||||
}
|
||||
auto frame = rtp->getPayload();
|
||||
auto length = rtp->getPayloadSize();
|
||||
auto stamp = rtp->getStampMS();
|
||||
auto seq = rtp->getSeq();
|
||||
int nal = H265_TYPE(frame[0]);
|
||||
@@ -194,16 +198,16 @@ bool H265RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtp) {
|
||||
switch (nal) {
|
||||
case 48:
|
||||
// aggregated packet (AP) - with two or more NAL units
|
||||
return unpackAp(rtp, frame, length, stamp);
|
||||
return unpackAp(rtp, frame, payload_size, stamp);
|
||||
|
||||
case 49:
|
||||
// fragmentation unit (FU)
|
||||
return mergeFu(rtp, frame, length, stamp, seq);
|
||||
return mergeFu(rtp, frame, payload_size, stamp, seq);
|
||||
|
||||
default: {
|
||||
if (nal < 48) {
|
||||
// Single NAL Unit Packets (p24)
|
||||
return singleFrame(rtp, frame, length, stamp);
|
||||
return singleFrame(rtp, frame, payload_size, stamp);
|
||||
}
|
||||
_gop_dropped = true;
|
||||
WarnL << "不支持该类型的265 RTP包, nal type" << nal << ", rtp:\r\n" << rtp->dumpString();
|
||||
|
||||
Reference in New Issue
Block a user