@@ -7,6 +7,10 @@ import (
77 "io"
88)
99
10+ const (
11+ startCodeEmulationPreventionByte = 0x03
12+ )
13+
1014var ErrNotReedSeeker = errors .New ("Reader does not support Seek" )
1115
1216// NewEBSPReader - return a new Reader.
@@ -39,7 +43,7 @@ func (r *EBSPReader) MustRead(n int) uint {
3943 panic ("Reading error" )
4044 }
4145 r .pos ++
42- if r .zeroCount == 2 {
46+ if r .zeroCount == 2 && b == startCodeEmulationPreventionByte {
4347 err = binary .Read (r .rd , binary .BigEndian , & b )
4448 if err != nil {
4549 panic ("Reading error" )
@@ -70,7 +74,7 @@ func (r *EBSPReader) MustReadFlag() bool {
7074 return r .MustRead (1 ) == 1
7175}
7276
73- // MustReadExpGolomb - Read one unsigned exponential golomb code
77+ // MustReadExpGolomb - Read one unsigned exponential golomb code. Panic if not possible
7478func (r * EBSPReader ) MustReadExpGolomb () uint {
7579 leadingZeroBits := 0
7680
@@ -88,7 +92,7 @@ func (r *EBSPReader) MustReadExpGolomb() uint {
8892 return res + endBits
8993}
9094
91- // MustReadSignedGolomb - Read one signed exponential golomb code
95+ // MustReadSignedGolomb - Read one signed exponential golomb code. Panic if not possible
9296func (r * EBSPReader ) MustReadSignedGolomb () int {
9397 unsignedGolomb := r .MustReadExpGolomb ()
9498 if unsignedGolomb % 2 == 1 {
@@ -108,13 +112,13 @@ func (r *EBSPReader) NrBitsReadInCurrentByte() int {
108112 return 8 - r .n
109113}
110114
111- // EBSP2rbsp - convert from EBSP to RBSP by removing escape 0x03 after two 0x00
115+ // EBSP2rbsp - convert from EBSP to RBSP by removing start code emulation prevention bytes
112116func EBSP2rbsp (ebsp []byte ) []byte {
113117 zeroCount := 0
114118 output := make ([]byte , 0 , len (ebsp ))
115119 for i := 0 ; i < len (ebsp ); i ++ {
116120 b := ebsp [i ]
117- if zeroCount == 2 && b == 3 {
121+ if zeroCount == 2 && b == startCodeEmulationPreventionByte {
118122 zeroCount = 0
119123 } else {
120124 if b != 0 {
@@ -140,7 +144,7 @@ func (r *EBSPReader) Read(n int) (uint, error) {
140144 return 0 , err
141145 }
142146 r .pos ++
143- if r .zeroCount == 2 && b <= 3 {
147+ if r .zeroCount == 2 && b == startCodeEmulationPreventionByte {
144148 err = binary .Read (r .rd , binary .BigEndian , & b )
145149 if err != nil {
146150 return 0 , err
@@ -220,7 +224,7 @@ func (r *EBSPReader) IsSeeker() bool {
220224}
221225
222226// MoreRbspData - false if next bit is 1 and last 1 in fullSlice
223- // Underlying reader must support ReadSeeker interface
227+ // Underlying reader must support ReadSeeker interface to reset after check
224228func (r * EBSPReader ) MoreRbspData () (bool , error ) {
225229 if ! r .IsSeeker () {
226230 return false , ErrNotReedSeeker
@@ -239,7 +243,7 @@ func (r *EBSPReader) MoreRbspData() (bool, error) {
239243 }
240244 return true , nil
241245 }
242- // Must check if all remaining bits are zero
246+ // If all remainging bits are zero, there is no more rbsp data
243247 more := false
244248 for {
245249 b , err := r .Read (1 )
@@ -261,6 +265,7 @@ func (r *EBSPReader) MoreRbspData() (bool, error) {
261265 return more , nil
262266}
263267
268+ // reset EBSPReader based on copy of previous state
264269func (r * EBSPReader ) reset (prevState EBSPReader ) error {
265270 rdSeek , ok := r .rd .(io.ReadSeeker )
266271
0 commit comments