-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpayload_h264.go
52 lines (44 loc) · 1.16 KB
/
payload_h264.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package rtp
type H264Muxer struct {
muxer
// FU头数据
// indicator+header2个字节
fuHeader []byte
}
// Input 输入不包含start code的单个NalU
func (m *H264Muxer) Input(data []byte, timestamp uint32, alloc func() []byte, write func([]byte)) int {
type_ := data[0] & 0x1F
length := len(data)
// 小于RTP(MTU)负载大小的NalU, 单一打包
// 小于RTP(MTU)负载大小的NalU, 分片使用FU-A打包
if length < m.maxPayloadSize {
return m.muxer.Input(data, timestamp, alloc, write)
} else {
// 取原本的F和NRI
m.fuHeader[0] = data[0] & 0xE0
// FU-A 分片单元
m.fuHeader[0] |= 28
// S/E/R/TYPE
m.fuHeader[1] = 0
return splitPayloadData(data[1:], m.maxPayloadSize, func(payload []byte, start, end bool) {
if start {
m.fuHeader[1] = 0x80
} else if !end {
m.fuHeader[1] = 0x00
} else {
m.fuHeader[1] = 0x40
}
m.fuHeader[1] |= type_
bytes := alloc()
n := m.mux(bytes, timestamp, end, m.fuHeader, payload)
write(bytes[:n])
})
}
}
func NewH264Muxer(payload int, seq int, ssrc uint32) Muxer {
m := &H264Muxer{}
m.init(payload, seq, ssrc)
m.fuHeader = make([]byte, 2)
m.maxPayloadSize -= 2
return m
}