...

Source file src/image/jpeg/huffman.go

     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.
     4	
     5	package jpeg
     6	
     7	import (
     8		"io"
     9	)
    10	
    11	// maxCodeLength is the maximum (inclusive) number of bits in a Huffman code.
    12	const maxCodeLength = 16
    13	
    14	// maxNCodes is the maximum (inclusive) number of codes in a Huffman tree.
    15	const maxNCodes = 256
    16	
    17	// lutSize is the log-2 size of the Huffman decoder's look-up table.
    18	const lutSize = 8
    19	
    20	// huffman is a Huffman decoder, specified in section C.
    21	type huffman struct {
    22		// length is the number of codes in the tree.
    23		nCodes int32
    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
    27		// lutSize bits.
    28		lut [1 << lutSize]uint16
    29		// vals are the decoded values, sorted by their encoding.
    30		vals [maxNCodes]uint8
    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
    39	}
    40	
    41	// errShortHuffmanData means that an unexpected EOF occurred while decoding
    42	// Huffman data.
    43	var errShortHuffmanData = FormatError("short Huffman data")
    44	
    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 {
    49		for {
    50			c, err := d.readByteStuffedByte()
    51			if err != nil {
    52				if err == io.EOF {
    53					return errShortHuffmanData
    54				}
    55				return err
    56			}
    57			d.bits.a = d.bits.a<<8 | uint32(c)
    58			d.bits.n += 8
    59			if d.bits.m == 0 {
    60				d.bits.m = 1 << 7
    61			} else {
    62				d.bits.m <<= 8
    63			}
    64			if d.bits.n >= n {
    65				break
    66			}
    67		}
    68		return nil
    69	}
    70	
    71	// receiveExtend is the composition of RECEIVE and EXTEND, specified in section
    72	// F.2.2.1.
    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 {
    76				return 0, err
    77			}
    78		}
    79		d.bits.n -= int32(t)
    80		d.bits.m >>= t
    81		s := int32(1) << t
    82		x := int32(d.bits.a>>uint8(d.bits.n)) & (s - 1)
    83		if x < s>>1 {
    84			x += ((-1) << t) + 1
    85		}
    86		return x, nil
    87	}
    88	
    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 {
    92		for n > 0 {
    93			if n < 17 {
    94				return FormatError("DHT has wrong length")
    95			}
    96			if err := d.readFull(d.tmp[:17]); err != nil {
    97				return err
    98			}
    99			tc := d.tmp[0] >> 4
   100			if tc > maxTc {
   101				return FormatError("bad Tc value")
   102			}
   103			th := d.tmp[0] & 0x0f
   104			// The baseline th <= 1 restriction is specified in table B.5.
   105			if th > maxTh || (d.baseline && th > 1) {
   106				return FormatError("bad Th value")
   107			}
   108			h := &d.huff[tc][th]
   109	
   110			// Read nCodes and h.vals (and derive h.nCodes).
   111			// nCodes[i] is the number of codes with code length i.
   112			// h.nCodes is the total number of codes.
   113			h.nCodes = 0
   114			var nCodes [maxCodeLength]int32
   115			for i := range nCodes {
   116				nCodes[i] = int32(d.tmp[i+1])
   117				h.nCodes += nCodes[i]
   118			}
   119			if h.nCodes == 0 {
   120				return FormatError("Huffman table has zero length")
   121			}
   122			if h.nCodes > maxNCodes {
   123				return FormatError("Huffman table has excessive length")
   124			}
   125			n -= int(h.nCodes) + 17
   126			if n < 0 {
   127				return FormatError("DHT has wrong length")
   128			}
   129			if err := d.readFull(h.vals[:h.nCodes]); err != nil {
   130				return err
   131			}
   132	
   133			// Derive the look-up table.
   134			for i := range h.lut {
   135				h.lut[i] = 0
   136			}
   137			var x, code uint32
   138			for i := uint32(0); i < lutSize; i++ {
   139				code <<= 1
   140				for j := int32(0); j < nCodes[i]; j++ {
   141					// The codeLength is 1+i, so shift code by 8-(1+i) to
   142					// calculate the high bits for every 8-bit sequence
   143					// whose codeLength's high bits matches code.
   144					// The high 8 bits of lutValue are the encoded value.
   145					// The low 8 bits are 1 plus the codeLength.
   146					base := uint8(code << (7 - i))
   147					lutValue := uint16(h.vals[x])<<8 | uint16(2+i)
   148					for k := uint8(0); k < 1<<(7-i); k++ {
   149						h.lut[base|k] = lutValue
   150					}
   151					code++
   152					x++
   153				}
   154			}
   155	
   156			// Derive minCodes, maxCodes, and valsIndices.
   157			var c, index int32
   158			for i, n := range nCodes {
   159				if n == 0 {
   160					h.minCodes[i] = -1
   161					h.maxCodes[i] = -1
   162					h.valsIndices[i] = -1
   163				} else {
   164					h.minCodes[i] = c
   165					h.maxCodes[i] = c + n - 1
   166					h.valsIndices[i] = index
   167					c += n
   168					index += n
   169				}
   170				c <<= 1
   171			}
   172		}
   173		return nil
   174	}
   175	
   176	// decodeHuffman returns the next Huffman-coded value from the bit-stream,
   177	// decoded according to h.
   178	func (d *decoder) decodeHuffman(h *huffman) (uint8, error) {
   179		if h.nCodes == 0 {
   180			return 0, FormatError("uninitialized Huffman table")
   181		}
   182	
   183		if d.bits.n < 8 {
   184			if err := d.ensureNBits(8); err != nil {
   185				if err != errMissingFF00 && err != errShortHuffmanData {
   186					return 0, err
   187				}
   188				// There are no more bytes of data in this segment, but we may still
   189				// be able to read the next symbol out of the previously read bits.
   190				// First, undo the readByte that the ensureNBits call made.
   191				if d.bytes.nUnreadable != 0 {
   192					d.unreadByteStuffedByte()
   193				}
   194				goto slowPath
   195			}
   196		}
   197		if v := h.lut[(d.bits.a>>uint32(d.bits.n-lutSize))&0xff]; v != 0 {
   198			n := (v & 0xff) - 1
   199			d.bits.n -= int32(n)
   200			d.bits.m >>= n
   201			return uint8(v >> 8), nil
   202		}
   203	
   204	slowPath:
   205		for i, code := 0, int32(0); i < maxCodeLength; i++ {
   206			if d.bits.n == 0 {
   207				if err := d.ensureNBits(1); err != nil {
   208					return 0, err
   209				}
   210			}
   211			if d.bits.a&d.bits.m != 0 {
   212				code |= 1
   213			}
   214			d.bits.n--
   215			d.bits.m >>= 1
   216			if code <= h.maxCodes[i] {
   217				return h.vals[h.valsIndices[i]+code-h.minCodes[i]], nil
   218			}
   219			code <<= 1
   220		}
   221		return 0, FormatError("bad Huffman code")
   222	}
   223	
   224	func (d *decoder) decodeBit() (bool, error) {
   225		if d.bits.n == 0 {
   226			if err := d.ensureNBits(1); err != nil {
   227				return false, err
   228			}
   229		}
   230		ret := d.bits.a&d.bits.m != 0
   231		d.bits.n--
   232		d.bits.m >>= 1
   233		return ret, nil
   234	}
   235	
   236	func (d *decoder) decodeBits(n int32) (uint32, error) {
   237		if d.bits.n < n {
   238			if err := d.ensureNBits(n); err != nil {
   239				return 0, err
   240			}
   241		}
   242		ret := d.bits.a >> uint32(d.bits.n-n)
   243		ret &= (1 << uint32(n)) - 1
   244		d.bits.n -= n
   245		d.bits.m >>= uint32(n)
   246		return ret, nil
   247	}
   248	

View as plain text