@@ -79,14 +79,15 @@ func encodeChunkBasicHeader(w io.Writer, mh *chunkBasicHeader) error {
7979}
8080
8181type chunkMessageHeader struct {
82- timestamp uint32 // fmt = 0
83- timestampDelta uint32 // fmt = 1 | 2
84- messageLength uint32 // fmt = 0 | 1
85- messageTypeID byte // fmt = 0 | 1
86- messageStreamID uint32 // fmt = 0
82+ timestamp uint32 // fmt = 0
83+ timestampDelta uint32 // fmt = 1 | 2
84+ messageLength uint32 // fmt = 0 | 1
85+ messageTypeID byte // fmt = 0 | 1
86+ messageStreamID uint32 // fmt = 0
87+ extendedTimestampMode ExtendedTimestampMode // fmt = 0 | 1 | 2
8788}
8889
89- func decodeChunkMessageHeader (r io.Reader , fmt byte , buf []byte , mh * chunkMessageHeader ) error {
90+ func decodeChunkMessageHeader (r io.Reader , fmt byte , buf []byte , mh * chunkMessageHeader , extendedTimestampMode ExtendedTimestampMode ) error {
9091 if buf == nil || len (buf ) < 11 {
9192 buf = make ([]byte , 11 )
9293 }
@@ -104,8 +105,10 @@ func decodeChunkMessageHeader(r io.Reader, fmt byte, buf []byte, mh *chunkMessag
104105 mh .messageLength = binary .BigEndian .Uint32 (cache32bits )
105106 mh .messageTypeID = buf [6 ] // 8bits
106107 mh .messageStreamID = binary .LittleEndian .Uint32 (buf [7 :11 ]) // 32bits
108+ mh .extendedTimestampMode = ExtendedTimestampUnused
107109
108110 if mh .timestamp == 0xffffff {
111+ mh .extendedTimestampMode = ExtendedTimestampUsed
109112 _ , err := io .ReadAtLeast (r , cache32bits , 4 )
110113 if err != nil {
111114 return err
@@ -123,8 +126,10 @@ func decodeChunkMessageHeader(r io.Reader, fmt byte, buf []byte, mh *chunkMessag
123126 copy (cache32bits [1 :], buf [3 :6 ]) // 24bits BE
124127 mh .messageLength = binary .BigEndian .Uint32 (cache32bits )
125128 mh .messageTypeID = buf [6 ] // 8bits
129+ mh .extendedTimestampMode = ExtendedTimestampUnused
126130
127131 if mh .timestampDelta == 0xffffff {
132+ mh .extendedTimestampMode = ExtendedTimestampDeltaUsed
128133 _ , err := io .ReadAtLeast (r , cache32bits , 4 )
129134 if err != nil {
130135 return err
@@ -139,8 +144,10 @@ func decodeChunkMessageHeader(r io.Reader, fmt byte, buf []byte, mh *chunkMessag
139144
140145 copy (cache32bits [1 :], buf [0 :3 ]) // 24bits BE
141146 mh .timestampDelta = binary .BigEndian .Uint32 (cache32bits )
147+ mh .extendedTimestampMode = ExtendedTimestampUnused
142148
143149 if mh .timestampDelta == 0xffffff {
150+ mh .extendedTimestampMode = ExtendedTimestampDeltaUsed
144151 _ , err := io .ReadAtLeast (r , cache32bits , 4 )
145152 if err != nil {
146153 return err
@@ -149,7 +156,22 @@ func decodeChunkMessageHeader(r io.Reader, fmt byte, buf []byte, mh *chunkMessag
149156 }
150157
151158 case 3 :
152- // DO NOTHING
159+ // DO NOTHING unless an extended timestamp was used in preceding messages
160+ switch extendedTimestampMode {
161+ case ExtendedTimestampUsed :
162+ _ , err := io .ReadAtLeast (r , cache32bits , 4 )
163+ if err != nil {
164+ return err
165+ }
166+ mh .timestamp = binary .BigEndian .Uint32 (cache32bits )
167+
168+ case ExtendedTimestampDeltaUsed :
169+ _ , err := io .ReadAtLeast (r , cache32bits , 4 )
170+ if err != nil {
171+ return err
172+ }
173+ mh .timestampDelta = binary .BigEndian .Uint32 (cache32bits )
174+ }
153175
154176 default :
155177 panic ("Unexpected fmt" )
0 commit comments