diff --git a/codec/h264parser/parser.go b/codec/h264parser/parser.go index 8c01a1f..b015f9e 100644 --- a/codec/h264parser/parser.go +++ b/codec/h264parser/parser.go @@ -227,6 +227,9 @@ func SplitNALUs(b []byte) (nalus [][]byte, typ int) { _b := b[4:] nalus := [][]byte{} for { + if _val4 > uint32(len(_b)) { + break + } nalus = append(nalus, _b[:_val4]) _b = _b[_val4:] if len(_b) < 4 { diff --git a/format/rtspv2/client.go b/format/rtspv2/client.go index d8b05e8..50bd8c8 100644 --- a/format/rtspv2/client.go +++ b/format/rtspv2/client.go @@ -555,6 +555,9 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { client.BufferRtpPacket.Reset() } nalRaw, _ := h264parser.SplitNALUs(content[offset:end]) + if len(nalRaw) == 0 || len(nalRaw[0]) == 0 { + return nil, false + } var retmap []*av.Packet for _, nal := range nalRaw { if client.videoCodec == av.H265 { @@ -637,7 +640,7 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { if isEnd { client.fuStarted = false naluTypef := client.BufferRtpPacket.Bytes()[0] & 0x1f - if naluTypef == 7 { + if naluTypef == 7 || naluTypef == 9 { bufered, _ := h264parser.SplitNALUs(append([]byte{0, 0, 0, 1}, client.BufferRtpPacket.Bytes()...)) for _, v := range bufered { naluTypefs := v[0] & 0x1f