-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathnaluwriter.go
71 lines (59 loc) · 1.34 KB
/
naluwriter.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package main
import (
"encoding/binary"
"github.com/danielpaulus/quicktime_video_hack/screencapture/coremedia"
)
var startCode = []byte{00, 00, 00, 01}
type NaluWriter struct {
receiver *ReceiverHub
}
func NewNaluWriter(cliend *ReceiverHub) *NaluWriter {
return &NaluWriter{receiver: cliend}
}
func (nw NaluWriter) consumeVideo(buf coremedia.CMSampleBuffer) error {
if buf.HasFormatDescription {
err := nw.writeNalu(buf.FormatDescription.PPS)
if err != nil {
return err
}
err = nw.writeNalu(buf.FormatDescription.SPS)
if err != nil {
return err
}
}
if !buf.HasSampleData() {
return nil
}
return nw.writeNalus(buf.SampleData)
}
func (nw NaluWriter) Consume(buf coremedia.CMSampleBuffer) error {
if buf.MediaType == coremedia.MediaTypeSound {
// we don't support audio for now
//return nw.consumeAudio(buf)
return nil
}
return nw.consumeVideo(buf)
}
func (nw NaluWriter) writeNalus(bytes []byte) error {
slice := bytes
for len(slice) > 0 {
length := binary.BigEndian.Uint32(slice)
err := nw.writeNalu(slice[4 : length+4])
if err != nil {
return err
}
slice = slice[length+4:]
}
return nil
}
func (nw NaluWriter) writeNalu(bytes []byte) error {
if nw.receiver.closed {
return nil
}
if len(bytes) > 0 {
nw.receiver.send <- append(startCode, bytes...)
}
return nil
}
func (nw NaluWriter) Stop() {
}