[feat] rtp: 解析rtp header中的csrc

pull/241/head
q191201771 2 years ago
parent 3c675d563c
commit 9e29a0989b

@ -9,13 +9,13 @@
package rtprtcp
// (70 * 365 + 17) * 24 * 60 * 60
const offset uint64 = 2208988800
const ntpOffset uint64 = 2208988800
// Ntp2UnixNano 将ntp时间戳转换为Unix时间戳Unix时间戳单位是纳秒
func Ntp2UnixNano(v uint64) uint64 {
msw := v >> 32
lsw := v & 0xFFFFFFFF
return (msw-offset)*1e9 + (lsw*1e9)>>32
return (msw-ntpOffset)*1e9 + (lsw*1e9)>>32
}
// MswLsw2UnixNano 将ntp时间戳高32位低32位分开的形式转换为Unix时间戳

@ -55,8 +55,9 @@ func NewRtpPacker(payloadPacker IRtpPackerPayload, clockRate int, ssrc uint32, m
// Pack
//
// @param pkt:
// - pkt.Timestamp 绝对时间戳,单位毫秒。
// - pkt.PayloadType rtp包头中的packet type。
//
// - pkt.Timestamp 绝对时间戳,单位毫秒。
// - pkt.PayloadType rtp包头中的packet type。
func (r *RtpPacker) Pack(pkt base.AvPacket) (out []RtpPacket) {
payloads := r.payloadPacker.Pack(pkt.Payload, r.option.MaxPayloadSize)
for i, payload := range payloads {

@ -32,6 +32,9 @@ import (
// | .... |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// TODO(chef): ext 202210
// TODO(chef): padding 202210
const (
RtpFixedHeaderLength = 12
@ -58,7 +61,9 @@ type RtpHeader struct {
Timestamp uint32 // 32b **** samples
Ssrc uint32 // 32b **** Synchronization source
payloadOffset uint32
Csrc []uint32
payloadOffset uint32 // body部分真正数据部分的起始位置
}
type RtpPacket struct {
@ -74,6 +79,8 @@ func (h *RtpHeader) PackTo(out []byte) {
bele.BePutUint16(out[2:], h.Seq)
bele.BePutUint32(out[4:], h.Timestamp)
bele.BePutUint32(out[8:], h.Ssrc)
// TODO(chef): pack csrc 202210
}
func MakeDefaultRtpHeader() RtpHeader {
@ -110,7 +117,17 @@ func ParseRtpHeader(b []byte) (h RtpHeader, err error) {
h.Timestamp = bele.BeUint32(b[4:])
h.Ssrc = bele.BeUint32(b[8:])
h.payloadOffset = RtpFixedHeaderLength
offset := RtpFixedHeaderLength
if h.CsrcCount > 0 {
h.Csrc = make([]uint32, h.CsrcCount)
}
for i := uint8(0); i < h.CsrcCount; i++ {
h.Csrc[i] = bele.BeUint32(b[offset:])
offset += 4
}
h.payloadOffset = uint32(offset)
return
}
@ -133,7 +150,9 @@ func (p *RtpPacket) Body() []byte {
return p.Raw[p.Header.payloadOffset:]
}
// IsAvcHevcBoundary @param pt: 取值范围为AvPacketPtAvc或AvPacketPtHevc否则直接返回false
// IsAvcHevcBoundary
//
// @param pt: 取值范围为AvPacketPtAvc或AvPacketPtHevc否则直接返回false
func IsAvcHevcBoundary(pkt RtpPacket, pt base.AvPacketPt) bool {
switch pt {
case base.AvPacketPtAvc:

Loading…
Cancel
Save