forked from Eyevinn/mp4ff
-
Notifications
You must be signed in to change notification settings - Fork 1
/
aereader.go
62 lines (51 loc) · 1.08 KB
/
aereader.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
package bits
import (
"encoding/binary"
"io"
)
// AccErrReader - bit reader that accumulates error
// First error can be fetched as reader.AccError()
type AccErrReader struct {
nrBits int // current number of bits
value uint // current accumulated value
err error
rd io.Reader
}
func (r *AccErrReader) AccError() error {
return r.err
}
// NewReader - return a new Reader
func NewAccErrReader(rd io.Reader) *AccErrReader {
return &AccErrReader{
rd: rd,
}
}
// Read - read n bits. Return 0, if error now or previously
func (r *AccErrReader) Read(n int) uint {
if r.err != nil {
return 0
}
for r.nrBits < n {
r.value <<= 8
var newByte uint8
err := binary.Read(r.rd, binary.BigEndian, &newByte)
if err != nil {
r.err = err
return 0
}
r.value |= uint(newByte)
r.nrBits += 8
}
value := r.value >> uint(r.nrBits-n)
r.nrBits -= n
r.value &= mask(r.nrBits)
return value
}
// ReadFlag - read 1 bit into flag. Return false if error now or previously
func (r *AccErrReader) ReadFlag() bool {
bit := r.Read(1)
if r.err != nil {
return false
}
return bit == 1
}