-
Notifications
You must be signed in to change notification settings - Fork 295
/
producer.go
59 lines (46 loc) · 1.31 KB
/
producer.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
package magic
import (
"bytes"
"encoding/hex"
"errors"
"io"
"github.com/AlexxIT/go2rtc/pkg/aac"
"github.com/AlexxIT/go2rtc/pkg/core"
"github.com/AlexxIT/go2rtc/pkg/flv"
"github.com/AlexxIT/go2rtc/pkg/h264/annexb"
"github.com/AlexxIT/go2rtc/pkg/magic/bitstream"
"github.com/AlexxIT/go2rtc/pkg/magic/mjpeg"
"github.com/AlexxIT/go2rtc/pkg/mpegts"
"github.com/AlexxIT/go2rtc/pkg/multipart"
)
func Open(r io.Reader) (core.Producer, error) {
rd := core.NewReadBuffer(r)
b, err := rd.Peek(4)
if err != nil {
return nil, err
}
switch {
case bytes.HasPrefix(b, []byte(annexb.StartCode)):
return bitstream.Open(rd)
case bytes.HasPrefix(b, []byte{0xFF, 0xD8}):
return mjpeg.Open(rd)
case bytes.HasPrefix(b, []byte(flv.Signature)):
return flv.Open(rd)
case bytes.HasPrefix(b, []byte("--")):
return multipart.Open(rd)
case b[0] == 0xFF && b[1]&0xF7 == 0xF1:
return aac.Open(rd)
case b[0] == mpegts.SyncByte:
return mpegts.Open(rd)
}
// support MJPEG with trash on start
// https://github.com/AlexxIT/go2rtc/issues/747
if b, err = rd.Peek(4096); err != nil {
return nil, err
}
if i := bytes.Index(b, []byte{0xFF, 0xD8, 0xFF, 0xDB}); i > 0 {
_, _ = io.ReadFull(rd, make([]byte, i))
return mjpeg.Open(rd)
}
return nil, errors.New("magic: unsupported header: " + hex.EncodeToString(b[:4]))
}