diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 4d1d6390a..ebfd088cb 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1256,7 +1256,7 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage* msg, const vect } if (first_nalu_type == SrsAvcNaluTypeReserved) { - first_nalu_type = SrsAvcNaluType((uint8_t)(sample->bytes[0] & kNalTypeMask)); + first_nalu_type = SrsAvcNaluTypeParse(sample->bytes[0]); } raw_raw->push_back(sample->copy()); @@ -1336,7 +1336,7 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage* msg, const vect srs_freep(fua); return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); } - fua->nalu_type = (SrsAvcNaluType)(header & kNalTypeMask); + fua->nalu_type = SrsAvcNaluTypeParse(header); fua->start = bool(i == 0); fua->end = bool(i == num_of_packet - 1); @@ -1409,25 +1409,23 @@ srs_error_t SrsRtcRtpBuilder::package_fu_a(SrsSharedPtrMessage* msg, SrsSample* pkt->nalu_type = is_hevc ? kFuHevc : kFuA; if (is_hevc) { - uint8_t nal_type = SrsHevcNaluTypeParse(header); // H265 FU-A header SrsRtpFUAPayloadHevc2* fua = new SrsRtpFUAPayloadHevc2(); pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUAHevc); - fua->nalu_type = (SrsHevcNaluType)nal_type; + fua->nalu_type = SrsHevcNaluTypeParse(header); fua->start = bool(i == 0); fua->end = bool(i == num_of_packet - 1); fua->payload = p; fua->size = packet_size; } else { - uint8_t nal_type = header & kNalTypeMask; // H264 FU-A header SrsRtpFUAPayload2* fua = new SrsRtpFUAPayload2(); pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUA2); fua->nri = (SrsAvcNaluType)header; - fua->nalu_type = (SrsAvcNaluType)nal_type; + fua->nalu_type = SrsAvcNaluTypeParse(header); fua->start = bool(i == 0); fua->end = bool(i == num_of_packet - 1); diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 4dfc55bf7..38e68211a 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -707,7 +707,7 @@ srs_error_t SrsVideoFrame::parse_avc_nalu_type(const SrsSample* sample, SrsAvcNa } uint8_t header = sample->bytes[0]; - avc_nalu_type = (SrsAvcNaluType)(header & kNalTypeMask); + avc_nalu_type = SrsAvcNaluTypeParse(header); return err; } @@ -760,7 +760,7 @@ srs_error_t SrsVideoFrame::parse_hevc_nalu_type(const SrsSample *sample, SrsHevc } uint8_t header = sample->bytes[0]; - hevc_nalu_type = (SrsHevcNaluType)((header >> 1) & 0x3f); + hevc_nalu_type = SrsHevcNaluTypeParse(header); return err; } diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 8a1758667..e461b0790 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -422,6 +422,8 @@ enum SrsAvcNaluType // Coded slice extension slice_layer_extension_rbsp( ) SrsAvcNaluTypeCodedSliceExt = 20, }; +// @see https://datatracker.ietf.org/doc/html/rfc6184#section-1.3 +#define SrsAvcNaluTypeParse(code) (SrsAvcNaluType)(code & 0x1F) std::string srs_avc_nalu2str(SrsAvcNaluType nalu_type); #ifdef SRS_H265 diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index b547f233e..5ba2204ab 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -1208,7 +1208,7 @@ SrsSample* SrsRtpSTAPPayload::get_sps() continue; } - SrsAvcNaluType nalu_type = (SrsAvcNaluType)(p->bytes[0] & kNalTypeMask); + SrsAvcNaluType nalu_type = SrsAvcNaluTypeParse(p->bytes[0]); if (nalu_type == SrsAvcNaluTypeSPS) { return p; } @@ -1226,7 +1226,7 @@ SrsSample* SrsRtpSTAPPayload::get_pps() continue; } - SrsAvcNaluType nalu_type = (SrsAvcNaluType)(p->bytes[0] & kNalTypeMask); + SrsAvcNaluType nalu_type = SrsAvcNaluTypeParse(p->bytes[0]); if (nalu_type == SrsAvcNaluTypePPS) { return p; } @@ -1412,7 +1412,7 @@ srs_error_t SrsRtpFUAPayload::decode(SrsBuffer* buf) v = buf->read_1bytes(); start = v & kStart; end = v & kEnd; - nalu_type = SrsAvcNaluType(v & kNalTypeMask); + nalu_type = SrsAvcNaluTypeParse(v); if (!buf->require(1)) { return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1); @@ -1513,7 +1513,7 @@ srs_error_t SrsRtpFUAPayload2::decode(SrsBuffer* buf) v = buf->read_1bytes(); start = v & kStart; end = v & kEnd; - nalu_type = SrsAvcNaluType(v & kNalTypeMask); + nalu_type = SrsAvcNaluTypeParse(v); if (!buf->require(1)) { return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1); diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index b40679008..9603c512c 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -62,7 +62,7 @@ VOID TEST(KernelRTCTest, RtpSTAPPayloadException) SrsAvcNaluType nalu_type = SrsAvcNaluTypeReserved; // Try to parse the NALU type for video decoder. if (!buf.empty()) { - nalu_type = SrsAvcNaluType((uint8_t)(buf.head()[0] & kNalTypeMask)); + nalu_type = SrsAvcNaluTypeParse(buf.head()[0]); } EXPECT_TRUE(nalu_type == kStapA);