You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.4 KiB
Go

package icsrtp
import (
"encoding/binary"
"gitlab.com/ics_cinnamon/voicegateway/icspacketparser"
)
type RTP struct {
Version int
Mark int
PayloadType icspacketparser.PayloadType
Seq uint16
Timestamp uint32
SSID uint32
PayloadLen int
Payload []byte
RtpHeaderByte []byte
}
const RTPHeaderLen = 12
func NewRTP(mark, pt, seq, ts, ssrc int, payload []byte) *RTP {
rtp := RTP{}
rtp.RtpHeaderByte = make([]byte, RTPHeaderLen)
//version, padding, extension, cc
rtp.RtpHeaderByte[0] = 0x80
//fmt.Printf("v %b\n", rtp.RtpHeaderByte[0])
//mark, payload type
m := byte(0xff & (mark << 7))
p := byte(0xff) & byte(pt)
rtp.RtpHeaderByte[1] = m | p
/*
fmt.Printf("m %b\n", m)
fmt.Printf("p %b\n", p)
*/
//sequence
o := make([]byte, 4)
binary.BigEndian.PutUint16(o, uint16(seq))
//o := ByteOrdering(uint(seq), 2, true)
/*
rtp.RtpHeaderByte[2] = o[1]
rtp.RtpHeaderByte[3] = o[0]
*/
copy(rtp.RtpHeaderByte[2:4], o[:2])
//fmt.Printf("seq: %d - %d|%d\n", seq, o[0], o[1])
/*
fmt.Printf("seq: %d - %d[%b]\n",
uint(seq),
uint16(rtp.RtpHeaderByte[2])|uint16(rtp.RtpHeaderByte[3])<<8,
uint16(rtp.RtpHeaderByte[2])|uint16(rtp.RtpHeaderByte[3])<<8)
*/
//timestamp
//o = ByteOrdering(uint(ts), 4, true)
binary.BigEndian.PutUint32(o, uint32(ts))
/*
rtp.RtpHeaderByte[4] = o[3]
rtp.RtpHeaderByte[5] = o[2]
rtp.RtpHeaderByte[6] = o[1]
rtp.RtpHeaderByte[7] = o[0]
*/
copy(rtp.RtpHeaderByte[4:8], o[:])
/*
fmt.Printf("time now %d, %d\n",
uint32(ts),
uint32(rtp.RtpHeaderByte[4])|uint32(rtp.RtpHeaderByte[5])<<8|uint32(rtp.RtpHeaderByte[6])<<16|uint32(rtp.RtpHeaderByte[7])<<24)
*/
//ssrc
//o = ByteOrdering(uint(ssrc), 4, true)
binary.BigEndian.PutUint32(o, uint32(ssrc))
/*
rtp.RtpHeaderByte[8] = o[3]
rtp.RtpHeaderByte[9] = o[2]
rtp.RtpHeaderByte[10] = o[1]
rtp.RtpHeaderByte[11] = o[0]
*/
copy(rtp.RtpHeaderByte[8:], o[:])
/*
fmt.Printf("ssrc %x, %x\n",
uint32(ssrc),
uint32(rtp.RtpHeaderByte[8])|uint32(rtp.RtpHeaderByte[9])<<8|uint32(rtp.RtpHeaderByte[10])<<16|uint32(rtp.RtpHeaderByte[11])<<24)
*/
rtp.Payload = make([]byte, len(payload))
copy(rtp.Payload, payload)
return &rtp
}
func (r RTP) Byte() []byte {
payloadLen := len(r.Payload)
ret := make([]byte, payloadLen+RTPHeaderLen)
offset := copy(ret, r.RtpHeaderByte)
copy(ret[offset:], r.Payload)
return ret
}