mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
Ignore invalid H264/H265 rtmp packet instead of throwing an error
This commit is contained in:
parent
473228a128
commit
dfda93a4c4
@ -14,16 +14,24 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace toolkit;
|
using namespace toolkit;
|
||||||
|
|
||||||
|
#define CHECK_RET(...) \
|
||||||
|
try { \
|
||||||
|
CHECK(__VA_ARGS__); \
|
||||||
|
} catch (AssertFailedException & ex) { \
|
||||||
|
WarnL << ex.what(); \
|
||||||
|
return; \
|
||||||
|
}
|
||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
void H264RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
void H264RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
||||||
if (pkt->isConfigFrame()) {
|
if (pkt->isConfigFrame()) {
|
||||||
CHECK(pkt->size() > 5);
|
CHECK_RET(pkt->size() > 5);
|
||||||
getTrack()->setExtraData((uint8_t *)pkt->data() + 5, pkt->size() - 5);
|
getTrack()->setExtraData((uint8_t *)pkt->data() + 5, pkt->size() - 5);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK(pkt->size() > 9);
|
CHECK_RET(pkt->size() > 9);
|
||||||
uint8_t *cts_ptr = (uint8_t *)(pkt->buffer.data() + 2);
|
uint8_t *cts_ptr = (uint8_t *)(pkt->buffer.data() + 2);
|
||||||
int32_t cts = (((cts_ptr[0] << 16) | (cts_ptr[1] << 8) | (cts_ptr[2])) + 0xff800000) ^ 0xff800000;
|
int32_t cts = (((cts_ptr[0] << 16) | (cts_ptr[1] << 8) | (cts_ptr[2])) + 0xff800000) ^ 0xff800000;
|
||||||
auto pts = pkt->time_stamp + cts;
|
auto pts = pkt->time_stamp + cts;
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace toolkit;
|
using namespace toolkit;
|
||||||
|
|
||||||
|
#define CHECK_RET(...) \
|
||||||
|
try { \
|
||||||
|
CHECK(__VA_ARGS__); \
|
||||||
|
} catch (AssertFailedException & ex) { \
|
||||||
|
WarnL << ex.what(); \
|
||||||
|
return; \
|
||||||
|
}
|
||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
||||||
@ -44,7 +52,7 @@ void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
|||||||
auto data = (uint8_t *)pkt->data() + RtmpPacketInfo::kEnhancedRtmpHeaderSize;
|
auto data = (uint8_t *)pkt->data() + RtmpPacketInfo::kEnhancedRtmpHeaderSize;
|
||||||
auto size = pkt->size() - RtmpPacketInfo::kEnhancedRtmpHeaderSize;
|
auto size = pkt->size() - RtmpPacketInfo::kEnhancedRtmpHeaderSize;
|
||||||
auto pts = pkt->time_stamp;
|
auto pts = pkt->time_stamp;
|
||||||
CHECK(size > 3);
|
CHECK_RET(size > 3);
|
||||||
if (RtmpPacketType::PacketTypeCodedFrames == _info.video.pkt_type) {
|
if (RtmpPacketType::PacketTypeCodedFrames == _info.video.pkt_type) {
|
||||||
// SI24 = [CompositionTime Offset]
|
// SI24 = [CompositionTime Offset]
|
||||||
int32_t cts = (((data[0] << 16) | (data[1] << 8) | (data[2])) + 0xff800000) ^ 0xff800000;
|
int32_t cts = (((data[0] << 16) | (data[1] << 8) | (data[2])) + 0xff800000) ^ 0xff800000;
|
||||||
@ -52,7 +60,7 @@ void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
|||||||
data += 3;
|
data += 3;
|
||||||
size -= 3;
|
size -= 3;
|
||||||
}
|
}
|
||||||
CHECK(size > 4);
|
CHECK_RET(size > 4);
|
||||||
splitFrame(data, size, pkt->time_stamp, pts);
|
splitFrame(data, size, pkt->time_stamp, pts);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -63,12 +71,12 @@ void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
|
|||||||
|
|
||||||
// 国内扩展(12) H265 rtmp
|
// 国内扩展(12) H265 rtmp
|
||||||
if (pkt->isConfigFrame()) {
|
if (pkt->isConfigFrame()) {
|
||||||
CHECK(pkt->size() > 5);
|
CHECK_RET(pkt->size() > 5);
|
||||||
getTrack()->setExtraData((uint8_t *)pkt->data() + 5, pkt->size() - 5);
|
getTrack()->setExtraData((uint8_t *)pkt->data() + 5, pkt->size() - 5);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK(pkt->size() > 9);
|
CHECK_RET(pkt->size() > 9);
|
||||||
uint8_t *cts_ptr = (uint8_t *)(pkt->buffer.data() + 2);
|
uint8_t *cts_ptr = (uint8_t *)(pkt->buffer.data() + 2);
|
||||||
int32_t cts = (((cts_ptr[0] << 16) | (cts_ptr[1] << 8) | (cts_ptr[2])) + 0xff800000) ^ 0xff800000;
|
int32_t cts = (((cts_ptr[0] << 16) | (cts_ptr[1] << 8) | (cts_ptr[2])) + 0xff800000) ^ 0xff800000;
|
||||||
auto pts = pkt->time_stamp + cts;
|
auto pts = pkt->time_stamp + cts;
|
||||||
|
Loading…
Reference in New Issue
Block a user