mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 07:06:58 +08:00
72 lines
1.1 KiB
Go
72 lines
1.1 KiB
Go
package gortsplib
|
|
|
|
import (
|
|
"github.com/pion/rtp"
|
|
|
|
"github.com/aler9/gortsplib/pkg/h264"
|
|
)
|
|
|
|
// find IDR NALUs without decoding RTP
|
|
func rtpH264ContainsIDR(pkt *rtp.Packet) bool {
|
|
if len(pkt.Payload) == 0 {
|
|
return false
|
|
}
|
|
|
|
typ := h264.NALUType(pkt.Payload[0] & 0x1F)
|
|
|
|
switch typ {
|
|
case h264.NALUTypeIDR:
|
|
return true
|
|
|
|
case 24: // STAP-A
|
|
payload := pkt.Payload[1:]
|
|
|
|
for len(payload) > 0 {
|
|
if len(payload) < 2 {
|
|
return false
|
|
}
|
|
|
|
size := uint16(payload[0])<<8 | uint16(payload[1])
|
|
payload = payload[2:]
|
|
|
|
if size == 0 || int(size) > len(payload) {
|
|
return false
|
|
}
|
|
|
|
nalu := payload[:size]
|
|
payload = payload[size:]
|
|
|
|
typ = h264.NALUType(nalu[0] & 0x1F)
|
|
if typ == h264.NALUTypeIDR {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
|
|
case 28: // FU-A
|
|
if len(pkt.Payload) < 2 {
|
|
return false
|
|
}
|
|
|
|
start := pkt.Payload[1] >> 7
|
|
if start != 1 {
|
|
return false
|
|
}
|
|
|
|
typ := h264.NALUType(pkt.Payload[1] & 0x1F)
|
|
return (typ == h264.NALUTypeIDR)
|
|
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func ptsEqualsDTS(track Track, pkt *rtp.Packet) bool {
|
|
if _, ok := track.(*TrackH264); ok {
|
|
return rtpH264ContainsIDR(pkt)
|
|
}
|
|
|
|
return true
|
|
}
|