mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-29 14:45:55 +08:00
H264 RTP解码支持STAP-A(24)类型
更新ZLToolKit(修复logger相关bug)
This commit is contained in:
parent
49c8d4fb8d
commit
059c118e95
@ -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,7 +108,43 @@ bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtppack) {
|
|||||||
return (isIDR); //i frame
|
return (isIDR); //i frame
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nal.type == 28) {
|
switch (nal.type){
|
||||||
|
case 24:{
|
||||||
|
// 24 STAP-A 单一时间的组合包
|
||||||
|
bool haveIDR = false;
|
||||||
|
auto ptr = frame + 1;
|
||||||
|
while(true){
|
||||||
|
int off = ptr - frame;
|
||||||
|
if (off >= length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//获取当前nalu的大小
|
||||||
|
uint16_t len = *ptr++;
|
||||||
|
len <<= 8;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 28:{
|
||||||
//FU-A
|
//FU-A
|
||||||
FU fu;
|
FU fu;
|
||||||
MakeFU(frame[1], fu);
|
MakeFU(frame[1], fu);
|
||||||
@ -142,16 +179,18 @@ bool H264RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtppack) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
WarnL << "不支持的rtp类型:" << (int)nal.type << " " << rtppack->sequence;
|
default:{
|
||||||
return false;
|
|
||||||
// 29 FU-B 单NAL单元B模式
|
// 29 FU-B 单NAL单元B模式
|
||||||
// 24 STAP-A 单一时间的组合包
|
|
||||||
// 25 STAP-B 单一时间的组合包
|
// 25 STAP-B 单一时间的组合包
|
||||||
// 26 MTAP16 多个时间的组合包
|
// 26 MTAP16 多个时间的组合包
|
||||||
// 27 MTAP24 多个时间的组合包
|
// 27 MTAP24 多个时间的组合包
|
||||||
// 0 udef
|
// 0 udef
|
||||||
// 30 udef
|
// 30 udef
|
||||||
// 31 udef
|
// 31 udef
|
||||||
|
WarnL << "不支持的rtp类型:" << (int)nal.type << " " << rtppack->sequence;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void H264RtpDecoder::onGetH264(const H264Frame::Ptr &frame) {
|
void H264RtpDecoder::onGetH264(const H264Frame::Ptr &frame) {
|
||||||
|
Loading…
Reference in New Issue
Block a user