Commit 059c118e by xiongziliang

H264 RTP解码支持STAP-A(24)类型

更新ZLToolKit(修复logger相关bug)
parent 49c8d4fb
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* MIT License * MIT License
* *
* Copyright (c) 2016 xiongziliang <771730766@qq.com> * Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2019 火宣 <459502659@qq.com>
* *
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit). * This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
* *
...@@ -107,51 +108,89 @@ bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtppack) { ...@@ -107,51 +108,89 @@ bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtppack) {
return (isIDR); //i frame return (isIDR); //i frame
} }
if (nal.type == 28) { switch (nal.type){
//FU-A case 24:{
FU fu; // 24 STAP-A 单一时间的组合包
MakeFU(frame[1], fu); bool haveIDR = false;
if (fu.S == 1) { auto ptr = frame + 1;
//FU-A start while(true){
char tmp = (nal.forbidden_zero_bit << 7 | nal.nal_ref_idc << 5 | fu.type); int off = ptr - frame;
_h264frame->buffer.assign("\x0\x0\x0\x1", 4); if (off >= length) {
_h264frame->buffer.push_back(tmp); break;
_h264frame->buffer.append((char *)frame + 2, length - 2); }
_h264frame->type = fu.type; //获取当前nalu的大小
_h264frame->timeStamp = rtppack->timeStamp; uint16_t len = *ptr++;
_h264frame->sequence = rtppack->sequence; len <<= 8;
return (_h264frame->type == H264Frame::NAL_IDR); //i frame len |= *ptr++;
if (off + len > length) {
break;
}
if(len >= 10){
//过小的帧丢弃
NALU nal;
MakeNalu(ptr[0], nal);
_h264frame->buffer.assign("\x0\x0\x0\x1", 4);
_h264frame->buffer.append((char *)ptr, len);
_h264frame->type = nal.type;
_h264frame->timeStamp = rtppack->timeStamp;
_h264frame->sequence = rtppack->sequence;
if(nal.type == H264Frame::NAL_IDR){
haveIDR = true;
}
onGetH264(_h264frame);
}
ptr += len;
}
return haveIDR;
} }
if (rtppack->sequence != (uint16_t)(_h264frame->sequence + 1)) { case 28:{
_h264frame->buffer.clear(); //FU-A
WarnL << "丢包,帧废弃:" << rtppack->sequence << "," << _h264frame->sequence; FU fu;
MakeFU(frame[1], fu);
if (fu.S == 1) {
//FU-A start
char tmp = (nal.forbidden_zero_bit << 7 | nal.nal_ref_idc << 5 | fu.type);
_h264frame->buffer.assign("\x0\x0\x0\x1", 4);
_h264frame->buffer.push_back(tmp);
_h264frame->buffer.append((char *)frame + 2, length - 2);
_h264frame->type = fu.type;
_h264frame->timeStamp = rtppack->timeStamp;
_h264frame->sequence = rtppack->sequence;
return (_h264frame->type == H264Frame::NAL_IDR); //i frame
}
if (rtppack->sequence != (uint16_t)(_h264frame->sequence + 1)) {
_h264frame->buffer.clear();
WarnL << "丢包,帧废弃:" << rtppack->sequence << "," << _h264frame->sequence;
return false;
}
_h264frame->sequence = rtppack->sequence;
if (fu.E == 1) {
//FU-A end
_h264frame->buffer.append((char *)frame + 2, length - 2);
_h264frame->timeStamp = rtppack->timeStamp;
auto isIDR = _h264frame->type == H264Frame::NAL_IDR;
onGetH264(_h264frame);
return isIDR;
}
//FU-A mid
_h264frame->buffer.append((char *)frame + 2, length - 2);
return false; return false;
} }
_h264frame->sequence = rtppack->sequence;
if (fu.E == 1) { default:{
//FU-A end // 29 FU-B 单NAL单元B模式
_h264frame->buffer.append((char *)frame + 2, length - 2); // 25 STAP-B 单一时间的组合包
_h264frame->timeStamp = rtppack->timeStamp; // 26 MTAP16 多个时间的组合包
auto isIDR = _h264frame->type == H264Frame::NAL_IDR; // 27 MTAP24 多个时间的组合包
onGetH264(_h264frame); // 0 udef
return isIDR; // 30 udef
// 31 udef
WarnL << "不支持的rtp类型:" << (int)nal.type << " " << rtppack->sequence;
return false;
} }
//FU-A mid
_h264frame->buffer.append((char *)frame + 2, length - 2);
return false;
} }
WarnL << "不支持的rtp类型:" << (int)nal.type << " " << rtppack->sequence;
return false;
// 29 FU-B 单NAL单元B模式
// 24 STAP-A 单一时间的组合包
// 25 STAP-B 单一时间的组合包
// 26 MTAP16 多个时间的组合包
// 27 MTAP24 多个时间的组合包
// 0 udef
// 30 udef
// 31 udef
} }
void H264RtpDecoder::onGetH264(const H264Frame::Ptr &frame) { void H264RtpDecoder::onGetH264(const H264Frame::Ptr &frame) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论