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
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
|
|
}
|