1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
11 // maxCodeLength is the maximum (inclusive) number of bits in a Huffman code.
12 const maxCodeLength
= 16
14 // maxNCodes is the maximum (inclusive) number of codes in a Huffman tree.
17 // lutSize is the log-2 size of the Huffman decoder's look-up table.
20 // huffman is a Huffman decoder, specified in section C.
22 // length is the number of codes in the tree.
24 // lut is the look-up table for the next lutSize bits in the bit-stream.
25 // The high 8 bits of the uint16 are the encoded value. The low 8 bits
26 // are 1 plus the code length, or 0 if the value is too large to fit in
28 lut
[1 << lutSize
]uint16
29 // vals are the decoded values, sorted by their encoding.
31 // minCodes[i] is the minimum code of length i, or -1 if there are no
32 // codes of that length.
33 minCodes
[maxCodeLength
]int32
34 // maxCodes[i] is the maximum code of length i, or -1 if there are no
35 // codes of that length.
36 maxCodes
[maxCodeLength
]int32
37 // valsIndices[i] is the index into vals of minCodes[i].
38 valsIndices
[maxCodeLength
]int32
41 // errShortHuffmanData means that an unexpected EOF occurred while decoding
43 var errShortHuffmanData
= FormatError("short Huffman data")
45 // ensureNBits reads bytes from the byte buffer to ensure that d.bits.n is at
46 // least n. For best performance (avoiding function calls inside hot loops),
47 // the caller is the one responsible for first checking that d.bits.n < n.
48 func (d
*decoder
) ensureNBits(n
int32) error
{
50 c
, err
:= d
.readByteStuffedByte()
53 return errShortHuffmanData
57 d
.bits
.a
= d
.bits
.a
<<8 |
uint32(c
)
71 // receiveExtend is the composition of RECEIVE and EXTEND, specified in section
73 func (d
*decoder
) receiveExtend(t
uint8) (int32, error
) {
74 if d
.bits
.n
< int32(t
) {
75 if err
:= d
.ensureNBits(int32(t
)); err
!= nil {
82 x
:= int32(d
.bits
.a
>>uint8(d
.bits
.n
)) & (s
- 1)
89 // processDHT processes a Define Huffman Table marker, and initializes a huffman
90 // struct from its contents. Specified in section B.2.4.2.
91 func (d
*decoder
) processDHT(n
int) error
{
94 return FormatError("DHT has wrong length")
96 if err
:= d
.readFull(d
.tmp
[:17]); err
!= nil {
101 return FormatError("bad Tc value")
103 th
:= d
.tmp
[0] & 0x0f
104 if th
> maxTh ||
!d
.progressive
&& th
> 1 {
105 return FormatError("bad Th value")
109 // Read nCodes and h.vals (and derive h.nCodes).
110 // nCodes[i] is the number of codes with code length i.
111 // h.nCodes is the total number of codes.
113 var nCodes
[maxCodeLength
]int32
114 for i
:= range nCodes
{
115 nCodes
[i
] = int32(d
.tmp
[i
+1])
116 h
.nCodes
+= nCodes
[i
]
119 return FormatError("Huffman table has zero length")
121 if h
.nCodes
> maxNCodes
{
122 return FormatError("Huffman table has excessive length")
124 n
-= int(h
.nCodes
) + 17
126 return FormatError("DHT has wrong length")
128 if err
:= d
.readFull(h
.vals
[:h
.nCodes
]); err
!= nil {
132 // Derive the look-up table.
133 for i
:= range h
.lut
{
137 for i
:= uint32(0); i
< lutSize
; i
++ {
139 for j
:= int32(0); j
< nCodes
[i
]; j
++ {
140 // The codeLength is 1+i, so shift code by 8-(1+i) to
141 // calculate the high bits for every 8-bit sequence
142 // whose codeLength's high bits matches code.
143 // The high 8 bits of lutValue are the encoded value.
144 // The low 8 bits are 1 plus the codeLength.
145 base
:= uint8(code
<< (7 - i
))
146 lutValue
:= uint16(h
.vals
[x
])<<8 |
uint16(2+i
)
147 for k
:= uint8(0); k
< 1<<(7-i
); k
++ {
148 h
.lut
[base|k
] = lutValue
155 // Derive minCodes, maxCodes, and valsIndices.
157 for i
, n
:= range nCodes
{
161 h
.valsIndices
[i
] = -1
164 h
.maxCodes
[i
] = c
+ n
- 1
165 h
.valsIndices
[i
] = index
175 // decodeHuffman returns the next Huffman-coded value from the bit-stream,
176 // decoded according to h.
177 func (d
*decoder
) decodeHuffman(h
*huffman
) (uint8, error
) {
179 return 0, FormatError("uninitialized Huffman table")
183 if err
:= d
.ensureNBits(8); err
!= nil {
184 if err
!= errMissingFF00
&& err
!= errShortHuffmanData
{
187 // There are no more bytes of data in this segment, but we may still
188 // be able to read the next symbol out of the previously read bits.
189 // First, undo the readByte that the ensureNBits call made.
190 if d
.bytes
.nUnreadable
!= 0 {
191 d
.unreadByteStuffedByte()
196 if v
:= h
.lut
[(d
.bits
.a
>>uint32(d
.bits
.n
-lutSize
))&0xff]; v
!= 0 {
200 return uint8(v
>> 8), nil
204 for i
, code
:= 0, int32(0); i
< maxCodeLength
; i
++ {
206 if err
:= d
.ensureNBits(1); err
!= nil {
210 if d
.bits
.a
&d
.bits
.m
!= 0 {
215 if code
<= h
.maxCodes
[i
] {
216 return h
.vals
[h
.valsIndices
[i
]+code
-h
.minCodes
[i
]], nil
220 return 0, FormatError("bad Huffman code")
223 func (d
*decoder
) decodeBit() (bool, error
) {
225 if err
:= d
.ensureNBits(1); err
!= nil {
229 ret
:= d
.bits
.a
&d
.bits
.m
!= 0
235 func (d
*decoder
) decodeBits(n
int32) (uint32, error
) {
237 if err
:= d
.ensureNBits(n
); err
!= nil {
241 ret
:= d
.bits
.a
>> uint32(d
.bits
.n
-n
)
242 ret
&= (1 << uint32(n
)) - 1
244 d
.bits
.m
>>= uint32(n
)