twitchapon-anim

Basic Twitchapon Receiver/Visuals
git clone git://bsandro.tech/twitchapon-anim
Log | Files | Refs | README | LICENSE

decode.go (14972B)


      1 // Copyright 2014 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 vp8l implements a decoder for the VP8L lossless image format.
      6 //
      7 // The VP8L specification is at:
      8 // https://developers.google.com/speed/webp/docs/riff_container
      9 package vp8l // import "golang.org/x/image/vp8l"
     10 
     11 import (
     12 	"bufio"
     13 	"errors"
     14 	"image"
     15 	"image/color"
     16 	"io"
     17 )
     18 
     19 var (
     20 	errInvalidCodeLengths = errors.New("vp8l: invalid code lengths")
     21 	errInvalidHuffmanTree = errors.New("vp8l: invalid Huffman tree")
     22 )
     23 
     24 // colorCacheMultiplier is the multiplier used for the color cache hash
     25 // function, specified in section 4.2.3.
     26 const colorCacheMultiplier = 0x1e35a7bd
     27 
     28 // distanceMapTable is the look-up table for distanceMap.
     29 var distanceMapTable = [120]uint8{
     30 	0x18, 0x07, 0x17, 0x19, 0x28, 0x06, 0x27, 0x29, 0x16, 0x1a,
     31 	0x26, 0x2a, 0x38, 0x05, 0x37, 0x39, 0x15, 0x1b, 0x36, 0x3a,
     32 	0x25, 0x2b, 0x48, 0x04, 0x47, 0x49, 0x14, 0x1c, 0x35, 0x3b,
     33 	0x46, 0x4a, 0x24, 0x2c, 0x58, 0x45, 0x4b, 0x34, 0x3c, 0x03,
     34 	0x57, 0x59, 0x13, 0x1d, 0x56, 0x5a, 0x23, 0x2d, 0x44, 0x4c,
     35 	0x55, 0x5b, 0x33, 0x3d, 0x68, 0x02, 0x67, 0x69, 0x12, 0x1e,
     36 	0x66, 0x6a, 0x22, 0x2e, 0x54, 0x5c, 0x43, 0x4d, 0x65, 0x6b,
     37 	0x32, 0x3e, 0x78, 0x01, 0x77, 0x79, 0x53, 0x5d, 0x11, 0x1f,
     38 	0x64, 0x6c, 0x42, 0x4e, 0x76, 0x7a, 0x21, 0x2f, 0x75, 0x7b,
     39 	0x31, 0x3f, 0x63, 0x6d, 0x52, 0x5e, 0x00, 0x74, 0x7c, 0x41,
     40 	0x4f, 0x10, 0x20, 0x62, 0x6e, 0x30, 0x73, 0x7d, 0x51, 0x5f,
     41 	0x40, 0x72, 0x7e, 0x61, 0x6f, 0x50, 0x71, 0x7f, 0x60, 0x70,
     42 }
     43 
     44 // distanceMap maps a LZ77 backwards reference distance to a two-dimensional
     45 // pixel offset, specified in section 4.2.2.
     46 func distanceMap(w int32, code uint32) int32 {
     47 	if int32(code) > int32(len(distanceMapTable)) {
     48 		return int32(code) - int32(len(distanceMapTable))
     49 	}
     50 	distCode := int32(distanceMapTable[code-1])
     51 	yOffset := distCode >> 4
     52 	xOffset := 8 - distCode&0xf
     53 	if d := yOffset*w + xOffset; d >= 1 {
     54 		return d
     55 	}
     56 	return 1
     57 }
     58 
     59 // decoder holds the bit-stream for a VP8L image.
     60 type decoder struct {
     61 	r     io.ByteReader
     62 	bits  uint32
     63 	nBits uint32
     64 }
     65 
     66 // read reads the next n bits from the decoder's bit-stream.
     67 func (d *decoder) read(n uint32) (uint32, error) {
     68 	for d.nBits < n {
     69 		c, err := d.r.ReadByte()
     70 		if err != nil {
     71 			if err == io.EOF {
     72 				err = io.ErrUnexpectedEOF
     73 			}
     74 			return 0, err
     75 		}
     76 		d.bits |= uint32(c) << d.nBits
     77 		d.nBits += 8
     78 	}
     79 	u := d.bits & (1<<n - 1)
     80 	d.bits >>= n
     81 	d.nBits -= n
     82 	return u, nil
     83 }
     84 
     85 // decodeTransform decodes the next transform and the width of the image after
     86 // transformation (or equivalently, before inverse transformation), specified
     87 // in section 3.
     88 func (d *decoder) decodeTransform(w int32, h int32) (t transform, newWidth int32, err error) {
     89 	t.oldWidth = w
     90 	t.transformType, err = d.read(2)
     91 	if err != nil {
     92 		return transform{}, 0, err
     93 	}
     94 	switch t.transformType {
     95 	case transformTypePredictor, transformTypeCrossColor:
     96 		t.bits, err = d.read(3)
     97 		if err != nil {
     98 			return transform{}, 0, err
     99 		}
    100 		t.bits += 2
    101 		t.pix, err = d.decodePix(nTiles(w, t.bits), nTiles(h, t.bits), 0, false)
    102 		if err != nil {
    103 			return transform{}, 0, err
    104 		}
    105 	case transformTypeSubtractGreen:
    106 		// No-op.
    107 	case transformTypeColorIndexing:
    108 		nColors, err := d.read(8)
    109 		if err != nil {
    110 			return transform{}, 0, err
    111 		}
    112 		nColors++
    113 		t.bits = 0
    114 		switch {
    115 		case nColors <= 2:
    116 			t.bits = 3
    117 		case nColors <= 4:
    118 			t.bits = 2
    119 		case nColors <= 16:
    120 			t.bits = 1
    121 		}
    122 		w = nTiles(w, t.bits)
    123 		pix, err := d.decodePix(int32(nColors), 1, 4*256, false)
    124 		if err != nil {
    125 			return transform{}, 0, err
    126 		}
    127 		for p := 4; p < len(pix); p += 4 {
    128 			pix[p+0] += pix[p-4]
    129 			pix[p+1] += pix[p-3]
    130 			pix[p+2] += pix[p-2]
    131 			pix[p+3] += pix[p-1]
    132 		}
    133 		// The spec says that "if the index is equal or larger than color_table_size,
    134 		// the argb color value should be set to 0x00000000 (transparent black)."
    135 		// We re-slice up to 256 4-byte pixels.
    136 		t.pix = pix[:4*256]
    137 	}
    138 	return t, w, nil
    139 }
    140 
    141 // repeatsCodeLength is the minimum code length for repeated codes.
    142 const repeatsCodeLength = 16
    143 
    144 // These magic numbers are specified at the end of section 5.2.2.
    145 // The 3-length arrays apply to code lengths >= repeatsCodeLength.
    146 var (
    147 	codeLengthCodeOrder = [19]uint8{
    148 		17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
    149 	}
    150 	repeatBits    = [3]uint8{2, 3, 7}
    151 	repeatOffsets = [3]uint8{3, 3, 11}
    152 )
    153 
    154 // decodeCodeLengths decodes a Huffman tree's code lengths which are themselves
    155 // encoded via a Huffman tree, specified in section 5.2.2.
    156 func (d *decoder) decodeCodeLengths(dst []uint32, codeLengthCodeLengths []uint32) error {
    157 	h := hTree{}
    158 	if err := h.build(codeLengthCodeLengths); err != nil {
    159 		return err
    160 	}
    161 
    162 	maxSymbol := len(dst)
    163 	useLength, err := d.read(1)
    164 	if err != nil {
    165 		return err
    166 	}
    167 	if useLength != 0 {
    168 		n, err := d.read(3)
    169 		if err != nil {
    170 			return err
    171 		}
    172 		n = 2 + 2*n
    173 		ms, err := d.read(n)
    174 		if err != nil {
    175 			return err
    176 		}
    177 		maxSymbol = int(ms) + 2
    178 		if maxSymbol > len(dst) {
    179 			return errInvalidCodeLengths
    180 		}
    181 	}
    182 
    183 	// The spec says that "if code 16 [meaning repeat] is used before
    184 	// a non-zero value has been emitted, a value of 8 is repeated."
    185 	prevCodeLength := uint32(8)
    186 
    187 	for symbol := 0; symbol < len(dst); {
    188 		if maxSymbol == 0 {
    189 			break
    190 		}
    191 		maxSymbol--
    192 		codeLength, err := h.next(d)
    193 		if err != nil {
    194 			return err
    195 		}
    196 		if codeLength < repeatsCodeLength {
    197 			dst[symbol] = codeLength
    198 			symbol++
    199 			if codeLength != 0 {
    200 				prevCodeLength = codeLength
    201 			}
    202 			continue
    203 		}
    204 
    205 		repeat, err := d.read(uint32(repeatBits[codeLength-repeatsCodeLength]))
    206 		if err != nil {
    207 			return err
    208 		}
    209 		repeat += uint32(repeatOffsets[codeLength-repeatsCodeLength])
    210 		if symbol+int(repeat) > len(dst) {
    211 			return errInvalidCodeLengths
    212 		}
    213 		// A code length of 16 repeats the previous non-zero code.
    214 		// A code length of 17 or 18 repeats zeroes.
    215 		cl := uint32(0)
    216 		if codeLength == 16 {
    217 			cl = prevCodeLength
    218 		}
    219 		for ; repeat > 0; repeat-- {
    220 			dst[symbol] = cl
    221 			symbol++
    222 		}
    223 	}
    224 	return nil
    225 }
    226 
    227 // decodeHuffmanTree decodes a Huffman tree into h.
    228 func (d *decoder) decodeHuffmanTree(h *hTree, alphabetSize uint32) error {
    229 	useSimple, err := d.read(1)
    230 	if err != nil {
    231 		return err
    232 	}
    233 	if useSimple != 0 {
    234 		nSymbols, err := d.read(1)
    235 		if err != nil {
    236 			return err
    237 		}
    238 		nSymbols++
    239 		firstSymbolLengthCode, err := d.read(1)
    240 		if err != nil {
    241 			return err
    242 		}
    243 		firstSymbolLengthCode = 7*firstSymbolLengthCode + 1
    244 		var symbols [2]uint32
    245 		symbols[0], err = d.read(firstSymbolLengthCode)
    246 		if err != nil {
    247 			return err
    248 		}
    249 		if nSymbols == 2 {
    250 			symbols[1], err = d.read(8)
    251 			if err != nil {
    252 				return err
    253 			}
    254 		}
    255 		return h.buildSimple(nSymbols, symbols, alphabetSize)
    256 	}
    257 
    258 	nCodes, err := d.read(4)
    259 	if err != nil {
    260 		return err
    261 	}
    262 	nCodes += 4
    263 	if int(nCodes) > len(codeLengthCodeOrder) {
    264 		return errInvalidHuffmanTree
    265 	}
    266 	codeLengthCodeLengths := [len(codeLengthCodeOrder)]uint32{}
    267 	for i := uint32(0); i < nCodes; i++ {
    268 		codeLengthCodeLengths[codeLengthCodeOrder[i]], err = d.read(3)
    269 		if err != nil {
    270 			return err
    271 		}
    272 	}
    273 	codeLengths := make([]uint32, alphabetSize)
    274 	if err = d.decodeCodeLengths(codeLengths, codeLengthCodeLengths[:]); err != nil {
    275 		return err
    276 	}
    277 	return h.build(codeLengths)
    278 }
    279 
    280 const (
    281 	huffGreen    = 0
    282 	huffRed      = 1
    283 	huffBlue     = 2
    284 	huffAlpha    = 3
    285 	huffDistance = 4
    286 	nHuff        = 5
    287 )
    288 
    289 // hGroup is an array of 5 Huffman trees.
    290 type hGroup [nHuff]hTree
    291 
    292 // decodeHuffmanGroups decodes the one or more hGroups used to decode the pixel
    293 // data. If one hGroup is used for the entire image, then hPix and hBits will
    294 // be zero. If more than one hGroup is used, then hPix contains the meta-image
    295 // that maps tiles to hGroup index, and hBits contains the log-2 tile size.
    296 func (d *decoder) decodeHuffmanGroups(w int32, h int32, topLevel bool, ccBits uint32) (
    297 	hGroups []hGroup, hPix []byte, hBits uint32, err error) {
    298 
    299 	maxHGroupIndex := 0
    300 	if topLevel {
    301 		useMeta, err := d.read(1)
    302 		if err != nil {
    303 			return nil, nil, 0, err
    304 		}
    305 		if useMeta != 0 {
    306 			hBits, err = d.read(3)
    307 			if err != nil {
    308 				return nil, nil, 0, err
    309 			}
    310 			hBits += 2
    311 			hPix, err = d.decodePix(nTiles(w, hBits), nTiles(h, hBits), 0, false)
    312 			if err != nil {
    313 				return nil, nil, 0, err
    314 			}
    315 			for p := 0; p < len(hPix); p += 4 {
    316 				i := int(hPix[p])<<8 | int(hPix[p+1])
    317 				if maxHGroupIndex < i {
    318 					maxHGroupIndex = i
    319 				}
    320 			}
    321 		}
    322 	}
    323 	hGroups = make([]hGroup, maxHGroupIndex+1)
    324 	for i := range hGroups {
    325 		for j, alphabetSize := range alphabetSizes {
    326 			if j == 0 && ccBits > 0 {
    327 				alphabetSize += 1 << ccBits
    328 			}
    329 			if err := d.decodeHuffmanTree(&hGroups[i][j], alphabetSize); err != nil {
    330 				return nil, nil, 0, err
    331 			}
    332 		}
    333 	}
    334 	return hGroups, hPix, hBits, nil
    335 }
    336 
    337 const (
    338 	nLiteralCodes  = 256
    339 	nLengthCodes   = 24
    340 	nDistanceCodes = 40
    341 )
    342 
    343 var alphabetSizes = [nHuff]uint32{
    344 	nLiteralCodes + nLengthCodes,
    345 	nLiteralCodes,
    346 	nLiteralCodes,
    347 	nLiteralCodes,
    348 	nDistanceCodes,
    349 }
    350 
    351 // decodePix decodes pixel data, specified in section 5.2.2.
    352 func (d *decoder) decodePix(w int32, h int32, minCap int32, topLevel bool) ([]byte, error) {
    353 	// Decode the color cache parameters.
    354 	ccBits, ccShift, ccEntries := uint32(0), uint32(0), ([]uint32)(nil)
    355 	useColorCache, err := d.read(1)
    356 	if err != nil {
    357 		return nil, err
    358 	}
    359 	if useColorCache != 0 {
    360 		ccBits, err = d.read(4)
    361 		if err != nil {
    362 			return nil, err
    363 		}
    364 		if ccBits < 1 || 11 < ccBits {
    365 			return nil, errors.New("vp8l: invalid color cache parameters")
    366 		}
    367 		ccShift = 32 - ccBits
    368 		ccEntries = make([]uint32, 1<<ccBits)
    369 	}
    370 
    371 	// Decode the Huffman groups.
    372 	hGroups, hPix, hBits, err := d.decodeHuffmanGroups(w, h, topLevel, ccBits)
    373 	if err != nil {
    374 		return nil, err
    375 	}
    376 	hMask, tilesPerRow := int32(0), int32(0)
    377 	if hBits != 0 {
    378 		hMask, tilesPerRow = 1<<hBits-1, nTiles(w, hBits)
    379 	}
    380 
    381 	// Decode the pixels.
    382 	if minCap < 4*w*h {
    383 		minCap = 4 * w * h
    384 	}
    385 	pix := make([]byte, 4*w*h, minCap)
    386 	p, cachedP := 0, 0
    387 	x, y := int32(0), int32(0)
    388 	hg, lookupHG := &hGroups[0], hMask != 0
    389 	for p < len(pix) {
    390 		if lookupHG {
    391 			i := 4 * (tilesPerRow*(y>>hBits) + (x >> hBits))
    392 			hg = &hGroups[uint32(hPix[i])<<8|uint32(hPix[i+1])]
    393 		}
    394 
    395 		green, err := hg[huffGreen].next(d)
    396 		if err != nil {
    397 			return nil, err
    398 		}
    399 		switch {
    400 		case green < nLiteralCodes:
    401 			// We have a literal pixel.
    402 			red, err := hg[huffRed].next(d)
    403 			if err != nil {
    404 				return nil, err
    405 			}
    406 			blue, err := hg[huffBlue].next(d)
    407 			if err != nil {
    408 				return nil, err
    409 			}
    410 			alpha, err := hg[huffAlpha].next(d)
    411 			if err != nil {
    412 				return nil, err
    413 			}
    414 			pix[p+0] = uint8(red)
    415 			pix[p+1] = uint8(green)
    416 			pix[p+2] = uint8(blue)
    417 			pix[p+3] = uint8(alpha)
    418 			p += 4
    419 
    420 			x++
    421 			if x == w {
    422 				x, y = 0, y+1
    423 			}
    424 			lookupHG = hMask != 0 && x&hMask == 0
    425 
    426 		case green < nLiteralCodes+nLengthCodes:
    427 			// We have a LZ77 backwards reference.
    428 			length, err := d.lz77Param(green - nLiteralCodes)
    429 			if err != nil {
    430 				return nil, err
    431 			}
    432 			distSym, err := hg[huffDistance].next(d)
    433 			if err != nil {
    434 				return nil, err
    435 			}
    436 			distCode, err := d.lz77Param(distSym)
    437 			if err != nil {
    438 				return nil, err
    439 			}
    440 			dist := distanceMap(w, distCode)
    441 			pEnd := p + 4*int(length)
    442 			q := p - 4*int(dist)
    443 			qEnd := pEnd - 4*int(dist)
    444 			if p < 0 || len(pix) < pEnd || q < 0 || len(pix) < qEnd {
    445 				return nil, errors.New("vp8l: invalid LZ77 parameters")
    446 			}
    447 			for ; p < pEnd; p, q = p+1, q+1 {
    448 				pix[p] = pix[q]
    449 			}
    450 
    451 			x += int32(length)
    452 			for x >= w {
    453 				x, y = x-w, y+1
    454 			}
    455 			lookupHG = hMask != 0
    456 
    457 		default:
    458 			// We have a color cache lookup. First, insert previous pixels
    459 			// into the cache. Note that VP8L assumes ARGB order, but the
    460 			// Go image.RGBA type is in RGBA order.
    461 			for ; cachedP < p; cachedP += 4 {
    462 				argb := uint32(pix[cachedP+0])<<16 |
    463 					uint32(pix[cachedP+1])<<8 |
    464 					uint32(pix[cachedP+2])<<0 |
    465 					uint32(pix[cachedP+3])<<24
    466 				ccEntries[(argb*colorCacheMultiplier)>>ccShift] = argb
    467 			}
    468 			green -= nLiteralCodes + nLengthCodes
    469 			if int(green) >= len(ccEntries) {
    470 				return nil, errors.New("vp8l: invalid color cache index")
    471 			}
    472 			argb := ccEntries[green]
    473 			pix[p+0] = uint8(argb >> 16)
    474 			pix[p+1] = uint8(argb >> 8)
    475 			pix[p+2] = uint8(argb >> 0)
    476 			pix[p+3] = uint8(argb >> 24)
    477 			p += 4
    478 
    479 			x++
    480 			if x == w {
    481 				x, y = 0, y+1
    482 			}
    483 			lookupHG = hMask != 0 && x&hMask == 0
    484 		}
    485 	}
    486 	return pix, nil
    487 }
    488 
    489 // lz77Param returns the next LZ77 parameter: a length or a distance, specified
    490 // in section 4.2.2.
    491 func (d *decoder) lz77Param(symbol uint32) (uint32, error) {
    492 	if symbol < 4 {
    493 		return symbol + 1, nil
    494 	}
    495 	extraBits := (symbol - 2) >> 1
    496 	offset := (2 + symbol&1) << extraBits
    497 	n, err := d.read(extraBits)
    498 	if err != nil {
    499 		return 0, err
    500 	}
    501 	return offset + n + 1, nil
    502 }
    503 
    504 // decodeHeader decodes the VP8L header from r.
    505 func decodeHeader(r io.Reader) (d *decoder, w int32, h int32, err error) {
    506 	rr, ok := r.(io.ByteReader)
    507 	if !ok {
    508 		rr = bufio.NewReader(r)
    509 	}
    510 	d = &decoder{r: rr}
    511 	magic, err := d.read(8)
    512 	if err != nil {
    513 		return nil, 0, 0, err
    514 	}
    515 	if magic != 0x2f {
    516 		return nil, 0, 0, errors.New("vp8l: invalid header")
    517 	}
    518 	width, err := d.read(14)
    519 	if err != nil {
    520 		return nil, 0, 0, err
    521 	}
    522 	width++
    523 	height, err := d.read(14)
    524 	if err != nil {
    525 		return nil, 0, 0, err
    526 	}
    527 	height++
    528 	_, err = d.read(1) // Read and ignore the hasAlpha hint.
    529 	if err != nil {
    530 		return nil, 0, 0, err
    531 	}
    532 	version, err := d.read(3)
    533 	if err != nil {
    534 		return nil, 0, 0, err
    535 	}
    536 	if version != 0 {
    537 		return nil, 0, 0, errors.New("vp8l: invalid version")
    538 	}
    539 	return d, int32(width), int32(height), nil
    540 }
    541 
    542 // DecodeConfig decodes the color model and dimensions of a VP8L image from r.
    543 func DecodeConfig(r io.Reader) (image.Config, error) {
    544 	_, w, h, err := decodeHeader(r)
    545 	if err != nil {
    546 		return image.Config{}, err
    547 	}
    548 	return image.Config{
    549 		ColorModel: color.NRGBAModel,
    550 		Width:      int(w),
    551 		Height:     int(h),
    552 	}, nil
    553 }
    554 
    555 // Decode decodes a VP8L image from r.
    556 func Decode(r io.Reader) (image.Image, error) {
    557 	d, w, h, err := decodeHeader(r)
    558 	if err != nil {
    559 		return nil, err
    560 	}
    561 	// Decode the transforms.
    562 	var (
    563 		nTransforms    int
    564 		transforms     [nTransformTypes]transform
    565 		transformsSeen [nTransformTypes]bool
    566 		originalW      = w
    567 	)
    568 	for {
    569 		more, err := d.read(1)
    570 		if err != nil {
    571 			return nil, err
    572 		}
    573 		if more == 0 {
    574 			break
    575 		}
    576 		var t transform
    577 		t, w, err = d.decodeTransform(w, h)
    578 		if err != nil {
    579 			return nil, err
    580 		}
    581 		if transformsSeen[t.transformType] {
    582 			return nil, errors.New("vp8l: repeated transform")
    583 		}
    584 		transformsSeen[t.transformType] = true
    585 		transforms[nTransforms] = t
    586 		nTransforms++
    587 	}
    588 	// Decode the transformed pixels.
    589 	pix, err := d.decodePix(w, h, 0, true)
    590 	if err != nil {
    591 		return nil, err
    592 	}
    593 	// Apply the inverse transformations.
    594 	for i := nTransforms - 1; i >= 0; i-- {
    595 		t := &transforms[i]
    596 		pix = inverseTransforms[t.transformType](t, pix, h)
    597 	}
    598 	return &image.NRGBA{
    599 		Pix:    pix,
    600 		Stride: 4 * int(originalW),
    601 		Rect:   image.Rect(0, 0, int(originalW), int(h)),
    602 	}, nil
    603 }