rtprtcp

package
v0.24.28 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 29, 2021 License: MIT Imports: 8 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RtcpPacketTypeSr  = 200 // 0xc8 Sender Report
	RtcpPacketTypeRr  = 201 // 0xc9 Receiver Report
	RtcpPacketTypeApp = 204

	RtcpHeaderLength = 4

	RtcpVersion = 2
)
View Source
const (
	NaluTypeAvcSingleMax = 23
	NaluTypeAvcStapa     = 24 // one packet, multiple nals
	NaluTypeAvcFua       = 28

	// TODO(chef): hevc有stapa格式吗
	NaluTypeHevcFua = 49
)
View Source
const (
	RtpPackerPayloadAvcHevcTypeNalu   RtpPackerPayloadAvcHevcType = 1
	RtpPackerPayloadAvcHevcTypeAvcc                               = 2
	RtpPackerPayloadAvcHevcTypeAnnexb                             = 3
)
View Source
const (
	RtpFixedHeaderLength = 12

	DefaultRtpVersion = 2
)
View Source
const (
	PositionTypeSingle    uint8 = 1
	PositionTypeFuaStart  uint8 = 2
	PositionTypeFuaMiddle uint8 = 3
	PositionTypeFuaEnd    uint8 = 4
	PositionTypeStapa     uint8 = 5
)
View Source
const MaxRtpRtcpPacketSize = 1500

Variables

View Source
var ErrRtcp = errors.New("lal.rtcp: fxxk")
View Source
var ErrRtp = errors.New("lal.rtp: fxxk")

Functions

func CompareSeq

func CompareSeq(a, b uint16) int

比较序号的值,内部处理序号翻转问题,见单元测试中的例子 @return 0 a和b相等

 1 a大于b
-1 a小于b

func IsAvcBoundary added in v0.24.1

func IsAvcBoundary(pkt RtpPacket) bool

func IsAvcHevcBoundary added in v0.24.1

func IsAvcHevcBoundary(pkt RtpPacket, pt base.AvPacketPt) bool

@param pt: 取值范围为AvPacketPtAvc或AvPacketPtHevc,否则直接返回false

func IsHevcBoundary added in v0.24.1

func IsHevcBoundary(pkt RtpPacket) bool

func MswLsw2Ntp added in v0.24.1

func MswLsw2Ntp(msw, lsw uint64) uint64

msw是ntp的高32位,lsw是ntp的低32位

func MswLsw2UnixNano added in v0.24.1

func MswLsw2UnixNano(msw, lsw uint64) uint64

将ntp时间戳(高32位低32位分开的形式)转换为Unix时间戳

func Ntp2UnixNano added in v0.24.1

func Ntp2UnixNano(v uint64) uint64

将ntp时间戳转换为Unix时间戳,Unix时间戳单位是纳秒

func SubSeq

func SubSeq(a, b uint16) int

a减b的值,内部处理序号翻转问题,如果a小于b,则返回负值,见单元测试中的例子

Types

type IRtpPackerPayload added in v0.24.1

type IRtpPackerPayload interface {
	// @param maxSize: rtp payload包体部分(不含包头)的最大大小
	//
	Pack(in []byte, maxSize int) (out [][]byte)
}

type IRtpUnpackContainer added in v0.24.1

type IRtpUnpackContainer interface {
	Feed(pkt RtpPacket)
}

type IRtpUnpacker added in v0.24.1

type IRtpUnpacker interface {
	IRtpUnpackContainer
}

func DefaultRtpUnpackerFactory added in v0.24.1

func DefaultRtpUnpackerFactory(payloadType base.AvPacketPt, clockRate int, maxSize int, onAvPacket OnAvPacket) IRtpUnpacker

目前支持AVC,HEVC和AAC MPEG4-GENERIC,业务方也可以自己实现IRtpUnpackerProtocol,甚至是IRtpUnpackContainer

type IRtpUnpackerProtocol added in v0.24.1

type IRtpUnpackerProtocol interface {
	// 计算rtp包处于帧中的位置
	CalcPositionIfNeeded(pkt *RtpPacket)

	// 尝试合成一个完整帧
	//
	// 从当前队列的第一个包开始合成
	// 如果一个rtp包对应一个完整帧,则合成一帧
	// 如果一个rtp包对应多个完整帧,则合成多帧
	// 如果多个rtp包对应一个完整帧,则尝试合成一帧
	//
	// @return unpackedFlag 本次调用是否成功合成
	// @return unpackedSeq  如果成功合成,合成使用的最后一个seq号;如果失败,则为0
	TryUnpackOne(list *RtpPacketList) (unpackedFlag bool, unpackedSeq uint16)
}

type ModRtpPackerOption added in v0.24.1

type ModRtpPackerOption func(option *RtpPackerOption)

type ModRtpPackerPayloadAvcHevcOption added in v0.24.1

type ModRtpPackerPayloadAvcHevcOption func(option *RtpPackerPayloadAvcHevcOption)

type OnAvPacket added in v0.24.1

type OnAvPacket func(pkt base.AvPacket)

pkt: pkt.Timestamp RTP包头中的时间戳(pts)经过clockrate换算后的时间戳,单位毫秒

                注意,不支持带B帧的视频流,pts和dts永远相同
pkt.PayloadType base.AvPacketPTXXX
pkt.Payload     AAC:
                  返回的是raw frame,一个AvPacket只包含一帧
                  引用的是接收到的RTP包中的内存块
                AVC或HEVC:
                  AVCC格式,每个NAL前包含4字节NAL的长度
                  新申请的内存块,回调结束后,内部不再使用该内存块
                  注意,这一层只做RTP包的合并,假如sps和pps是两个RTP single包,则合并结果为两个AvPacket,
                  假如sps和pps是一个stapA包,则合并结果为一个AvPacket

type Rr added in v0.24.1

type Rr struct {
	// contains filtered or unexported fields
}

func (*Rr) Pack added in v0.24.1

func (r *Rr) Pack() []byte

type RrProducer added in v0.24.1

type RrProducer struct {
	// contains filtered or unexported fields
}

func NewRrProducer added in v0.24.1

func NewRrProducer(clockRate int) *RrProducer

func (*RrProducer) FeedRtpPacket added in v0.24.1

func (r *RrProducer) FeedRtpPacket(seq uint16)

每次收到rtp包,都将seq序号传入这个函数

func (*RrProducer) Produce added in v0.24.1

func (r *RrProducer) Produce(lsr uint32) []byte

收到sr包时,产生rr包

@param lsr: 从sr包中获取,见func SR.GetMiddleNtp @return: rr包的二进制数据

type RtcpHeader added in v0.24.1

type RtcpHeader struct {
	Version       uint8  // 2b
	Padding       uint8  // 1b
	CountOrFormat uint8  // 5b
	PacketType    uint8  // 8b
	Length        uint16 // 16b, whole packet byte length = (Length+1) * 4
}

func ParseRtcpHeader added in v0.24.1

func ParseRtcpHeader(b []byte) RtcpHeader

func (*RtcpHeader) PackTo added in v0.24.1

func (r *RtcpHeader) PackTo(out []byte)

@param out 传出参数,注意,调用方保证长度>=4

type RtpHeader added in v0.24.1

type RtpHeader struct {
	Version    uint8  // 2b  *
	Padding    uint8  // 1b
	Extension  uint8  // 1
	CsrcCount  uint8  // 4b
	Mark       uint8  // 1b  *
	PacketType uint8  // 7b
	Seq        uint16 // 16b **
	Timestamp  uint32 // 32b **** samples
	Ssrc       uint32 // 32b **** Synchronization source
	// contains filtered or unexported fields
}

func MakeDefaultRtpHeader added in v0.24.1

func MakeDefaultRtpHeader() RtpHeader

func ParseRtpHeader added in v0.24.1

func ParseRtpHeader(b []byte) (h RtpHeader, err error)

func (*RtpHeader) PackTo added in v0.24.1

func (h *RtpHeader) PackTo(out []byte)

type RtpPacker added in v0.24.1

type RtpPacker struct {
	// contains filtered or unexported fields
}

func NewRtpPacker added in v0.24.1

func NewRtpPacker(payloadPacker IRtpPackerPayload, clockRate int, ssrc uint32, modOptions ...ModRtpPackerOption) *RtpPacker

func (*RtpPacker) Pack added in v0.24.1

func (r *RtpPacker) Pack(pkt base.AvPacket) (out []RtpPacket)

@param pkt: pkt.Timestamp 绝对时间戳,单位毫秒

pkt.PayloadType rtp包头中的packet type

type RtpPackerOption added in v0.24.1

type RtpPackerOption struct {
	MaxPayloadSize int
	FirstSeq       uint16 // 初始seq,如果不设置,则随机产生
}

type RtpPackerPayloadAac added in v0.24.1

type RtpPackerPayloadAac struct {
}

func NewRtpPackerPayloadAac added in v0.24.1

func NewRtpPackerPayloadAac() *RtpPackerPayloadAac

func (*RtpPackerPayloadAac) Pack added in v0.24.1

func (r *RtpPackerPayloadAac) Pack(in []byte, maxSize int) (out [][]byte)

type RtpPackerPayloadAvcHevc added in v0.24.1

type RtpPackerPayloadAvcHevc struct {
	// contains filtered or unexported fields
}

func NewRtpPackerPayloadAvc added in v0.24.1

func NewRtpPackerPayloadAvc(modOptions ...ModRtpPackerPayloadAvcHevcOption) *RtpPackerPayloadAvcHevc

func NewRtpPackerPayloadAvcHevc added in v0.24.1

func NewRtpPackerPayloadAvcHevc(payloadType base.AvPacketPt, modOptions ...ModRtpPackerPayloadAvcHevcOption) *RtpPackerPayloadAvcHevc

func NewRtpPackerPayloadHevc added in v0.24.1

func NewRtpPackerPayloadHevc(modOptions ...ModRtpPackerPayloadAvcHevcOption) *RtpPackerPayloadAvcHevc

func (*RtpPackerPayloadAvcHevc) Pack added in v0.24.1

func (r *RtpPackerPayloadAvcHevc) Pack(in []byte, maxSize int) (out [][]byte)

@param in: AVCC格式

@return out: 内存块为独立新申请;函数返回后,内部不再持有该内存块

func (*RtpPackerPayloadAvcHevc) PackNal added in v0.24.1

func (r *RtpPackerPayloadAvcHevc) PackNal(nal []byte, maxSize int) (out [][]byte)

type RtpPackerPayloadAvcHevcOption added in v0.24.1

type RtpPackerPayloadAvcHevcOption struct {
	Typ RtpPackerPayloadAvcHevcType
}

type RtpPackerPayloadAvcHevcType added in v0.24.1

type RtpPackerPayloadAvcHevcType int

type RtpPacket added in v0.24.1

type RtpPacket struct {
	Header RtpHeader
	Raw    []byte // 包含header内存
	// contains filtered or unexported fields
}

func MakeRtpPacket added in v0.24.1

func MakeRtpPacket(h RtpHeader, payload []byte) (pkt RtpPacket)

func ParseRtpPacket added in v0.24.1

func ParseRtpPacket(b []byte) (pkt RtpPacket, err error)

函数调用结束后,不持有参数<b>的内存块

func (*RtpPacket) Body added in v0.24.1

func (p *RtpPacket) Body() []byte

type RtpPacketList added in v0.24.1

type RtpPacketList struct {
	Head RtpPacketListItem // 哨兵,自身不存放rtp包,第一个rtp包存在在head.next中
	Size int               // 实际元素个数
}

type RtpPacketListItem added in v0.24.1

type RtpPacketListItem struct {
	Packet RtpPacket
	Next   *RtpPacketListItem
}

type RtpUnpackContainer added in v0.24.1

type RtpUnpackContainer struct {
	// contains filtered or unexported fields
}

func NewRtpUnpackContainer added in v0.24.1

func NewRtpUnpackContainer(maxSize int, unpackerProtocol IRtpUnpackerProtocol) *RtpUnpackContainer

func (*RtpUnpackContainer) Feed added in v0.24.1

func (r *RtpUnpackContainer) Feed(pkt RtpPacket)

输入收到的rtp包

type RtpUnpackerAac added in v0.24.1

type RtpUnpackerAac struct {
	// contains filtered or unexported fields
}

func NewRtpUnpackerAac added in v0.24.1

func NewRtpUnpackerAac(payloadType base.AvPacketPt, clockRate int, onAvPacket OnAvPacket) *RtpUnpackerAac

func (*RtpUnpackerAac) CalcPositionIfNeeded added in v0.24.1

func (unpacker *RtpUnpackerAac) CalcPositionIfNeeded(pkt *RtpPacket)

func (*RtpUnpackerAac) TryUnpackOne added in v0.24.1

func (unpacker *RtpUnpackerAac) TryUnpackOne(list *RtpPacketList) (unpackedFlag bool, unpackedSeq uint16)

type RtpUnpackerAvcHevc added in v0.24.1

type RtpUnpackerAvcHevc struct {
	// contains filtered or unexported fields
}

func NewRtpUnpackerAvcHevc added in v0.24.1

func NewRtpUnpackerAvcHevc(payloadType base.AvPacketPt, clockRate int, onAvPacket OnAvPacket) *RtpUnpackerAvcHevc

func (*RtpUnpackerAvcHevc) CalcPositionIfNeeded added in v0.24.1

func (unpacker *RtpUnpackerAvcHevc) CalcPositionIfNeeded(pkt *RtpPacket)

func (*RtpUnpackerAvcHevc) TryUnpackOne added in v0.24.1

func (unpacker *RtpUnpackerAvcHevc) TryUnpackOne(list *RtpPacketList) (unpackedFlag bool, unpackedSeq uint16)

type Sr added in v0.24.1

type Sr struct {
	SenderSsrc uint32
	Msw        uint32 // NTP timestamp, most significant word
	Lsw        uint32 // NTP timestamp, least significant word
	Timestamp  uint32
	PktCnt     uint32
	OctetCnt   uint32
}

func ParseSr added in v0.24.1

func ParseSr(b []byte) Sr

rfc3550 6.4.1

@param b rtcp包,包含包头

func (*Sr) GetMiddleNtp added in v0.24.1

func (s *Sr) GetMiddleNtp() uint32

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL