...
Run Format

Source file src/image/jpeg/huffman.go

Documentation: image/jpeg

  // Copyright 2009 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  package jpeg
  
  import (
  	"io"
  )
  
  // maxCodeLength is the maximum (inclusive) number of bits in a Huffman code.
  const maxCodeLength = 16
  
  // maxNCodes is the maximum (inclusive) number of codes in a Huffman tree.
  const maxNCodes = 256
  
  // lutSize is the log-2 size of the Huffman decoder's look-up table.
  const lutSize = 8
  
  // huffman is a Huffman decoder, specified in section C.
  type huffman struct {
  	// length is the number of codes in the tree.
  	nCodes int32
  	// lut is the look-up table for the next lutSize bits in the bit-stream.
  	// The high 8 bits of the uint16 are the encoded value. The low 8 bits
  	// are 1 plus the code length, or 0 if the value is too large to fit in
  	// lutSize bits.
  	lut [1 << lutSize]uint16
  	// vals are the decoded values, sorted by their encoding.
  	vals [maxNCodes]uint8
  	// minCodes[i] is the minimum code of length i, or -1 if there are no
  	// codes of that length.
  	minCodes [maxCodeLength]int32
  	// maxCodes[i] is the maximum code of length i, or -1 if there are no
  	// codes of that length.
  	maxCodes [maxCodeLength]int32
  	// valsIndices[i] is the index into vals of minCodes[i].
  	valsIndices [maxCodeLength]int32
  }
  
  // errShortHuffmanData means that an unexpected EOF occurred while decoding
  // Huffman data.
  var errShortHuffmanData = FormatError("short Huffman data")
  
  // ensureNBits reads bytes from the byte buffer to ensure that d.bits.n is at
  // least n. For best performance (avoiding function calls inside hot loops),
  // the caller is the one responsible for first checking that d.bits.n < n.
  func (d *decoder) ensureNBits(n int32) error {
  	for {
  		c, err := d.readByteStuffedByte()
  		if err != nil {
  			if err == io.EOF {
  				return errShortHuffmanData
  			}
  			return err
  		}
  		d.bits.a = d.bits.a<<8 | uint32(c)
  		d.bits.n += 8
  		if d.bits.m == 0 {
  			d.bits.m = 1 << 7
  		} else {
  			d.bits.m <<= 8
  		}
  		if d.bits.n >= n {
  			break
  		}
  	}
  	return nil
  }
  
  // receiveExtend is the composition of RECEIVE and EXTEND, specified in section
  // F.2.2.1.
  func (d *decoder) receiveExtend(t uint8) (int32, error) {
  	if d.bits.n < int32(t) {
  		if err := d.ensureNBits(int32(t)); err != nil {
  			return 0, err
  		}
  	}
  	d.bits.n -= int32(t)
  	d.bits.m >>= t
  	s := int32(1) << t
  	x := int32(d.bits.a>>uint8(d.bits.n)) & (s - 1)
  	if x < s>>1 {
  		x += ((-1) << t) + 1
  	}
  	return x, nil
  }
  
  // processDHT processes a Define Huffman Table marker, and initializes a huffman
  // struct from its contents. Specified in section B.2.4.2.
  func (d *decoder) processDHT(n int) error {
  	for n > 0 {
  		if n < 17 {
  			return FormatError("DHT has wrong length")
  		}
  		if err := d.readFull(d.tmp[:17]); err != nil {
  			return err
  		}
  		tc := d.tmp[0] >> 4
  		if tc > maxTc {
  			return FormatError("bad Tc value")
  		}
  		th := d.tmp[0] & 0x0f
  		// The baseline th <= 1 restriction is specified in table B.5.
  		if th > maxTh || (d.baseline && th > 1) {
  			return FormatError("bad Th value")
  		}
  		h := &d.huff[tc][th]
  
  		// Read nCodes and h.vals (and derive h.nCodes).
  		// nCodes[i] is the number of codes with code length i.
  		// h.nCodes is the total number of codes.
  		h.nCodes = 0
  		var nCodes [maxCodeLength]int32
  		for i := range nCodes {
  			nCodes[i] = int32(d.tmp[i+1])
  			h.nCodes += nCodes[i]
  		}
  		if h.nCodes == 0 {
  			return FormatError("Huffman table has zero length")
  		}
  		if h.nCodes > maxNCodes {
  			return FormatError("Huffman table has excessive length")
  		}
  		n -= int(h.nCodes) + 17
  		if n < 0 {
  			return FormatError("DHT has wrong length")
  		}
  		if err := d.readFull(h.vals[:h.nCodes]); err != nil {
  			return err
  		}
  
  		// Derive the look-up table.
  		for i := range h.lut {
  			h.lut[i] = 0
  		}
  		var x, code uint32
  		for i := uint32(0); i < lutSize; i++ {
  			code <<= 1
  			for j := int32(0); j < nCodes[i]; j++ {
  				// The codeLength is 1+i, so shift code by 8-(1+i) to
  				// calculate the high bits for every 8-bit sequence
  				// whose codeLength's high bits matches code.
  				// The high 8 bits of lutValue are the encoded value.
  				// The low 8 bits are 1 plus the codeLength.
  				base := uint8(code << (7 - i))
  				lutValue := uint16(h.vals[x])<<8 | uint16(2+i)
  				for k := uint8(0); k < 1<<(7-i); k++ {
  					h.lut[base|k] = lutValue
  				}
  				code++
  				x++
  			}
  		}
  
  		// Derive minCodes, maxCodes, and valsIndices.
  		var c, index int32
  		for i, n := range nCodes {
  			if n == 0 {
  				h.minCodes[i] = -1
  				h.maxCodes[i] = -1
  				h.valsIndices[i] = -1
  			} else {
  				h.minCodes[i] = c
  				h.maxCodes[i] = c + n - 1
  				h.valsIndices[i] = index
  				c += n
  				index += n
  			}
  			c <<= 1
  		}
  	}
  	return nil
  }
  
  // decodeHuffman returns the next Huffman-coded value from the bit-stream,
  // decoded according to h.
  func (d *decoder) decodeHuffman(h *huffman) (uint8, error) {
  	if h.nCodes == 0 {
  		return 0, FormatError("uninitialized Huffman table")
  	}
  
  	if d.bits.n < 8 {
  		if err := d.ensureNBits(8); err != nil {
  			if err != errMissingFF00 && err != errShortHuffmanData {
  				return 0, err
  			}
  			// There are no more bytes of data in this segment, but we may still
  			// be able to read the next symbol out of the previously read bits.
  			// First, undo the readByte that the ensureNBits call made.
  			if d.bytes.nUnreadable != 0 {
  				d.unreadByteStuffedByte()
  			}
  			goto slowPath
  		}
  	}
  	if v := h.lut[(d.bits.a>>uint32(d.bits.n-lutSize))&0xff]; v != 0 {
  		n := (v & 0xff) - 1
  		d.bits.n -= int32(n)
  		d.bits.m >>= n
  		return uint8(v >> 8), nil
  	}
  
  slowPath:
  	for i, code := 0, int32(0); i < maxCodeLength; i++ {
  		if d.bits.n == 0 {
  			if err := d.ensureNBits(1); err != nil {
  				return 0, err
  			}
  		}
  		if d.bits.a&d.bits.m != 0 {
  			code |= 1
  		}
  		d.bits.n--
  		d.bits.m >>= 1
  		if code <= h.maxCodes[i] {
  			return h.vals[h.valsIndices[i]+code-h.minCodes[i]], nil
  		}
  		code <<= 1
  	}
  	return 0, FormatError("bad Huffman code")
  }
  
  func (d *decoder) decodeBit() (bool, error) {
  	if d.bits.n == 0 {
  		if err := d.ensureNBits(1); err != nil {
  			return false, err
  		}
  	}
  	ret := d.bits.a&d.bits.m != 0
  	d.bits.n--
  	d.bits.m >>= 1
  	return ret, nil
  }
  
  func (d *decoder) decodeBits(n int32) (uint32, error) {
  	if d.bits.n < n {
  		if err := d.ensureNBits(n); err != nil {
  			return 0, err
  		}
  	}
  	ret := d.bits.a >> uint32(d.bits.n-n)
  	ret &= (1 << uint32(n)) - 1
  	d.bits.n -= n
  	d.bits.m >>= uint32(n)
  	return ret, nil
  }
  

View as plain text