Add brotli support
This commit is contained in:
parent
326161a563
commit
e5832d2c58
29 changed files with 13892 additions and 415 deletions
131
vendor/github.com/dsnet/compress/brotli/context.go
generated
vendored
Normal file
131
vendor/github.com/dsnet/compress/brotli/context.go
generated
vendored
Normal file
|
@ -0,0 +1,131 @@
|
|||
// Copyright 2015, Joe Tsai. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE.md file.
|
||||
|
||||
package brotli
|
||||
|
||||
// These constants are defined in RFC section 7.1.
|
||||
const (
|
||||
contextLSB6 = iota
|
||||
contextMSB6
|
||||
contextUTF8
|
||||
contextSigned
|
||||
|
||||
numContextModes
|
||||
)
|
||||
|
||||
// These constants are defined in RFC sections 2 and 7.3.
|
||||
const (
|
||||
maxLitContextIDs = 64
|
||||
maxDistContextIDs = 4
|
||||
)
|
||||
|
||||
// These LUTs are taken directly from RFC section 7.1.
|
||||
var (
|
||||
contextLUT0 = [256]uint8{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,
|
||||
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,
|
||||
12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,
|
||||
52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,
|
||||
12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,
|
||||
60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0,
|
||||
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
|
||||
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
|
||||
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
|
||||
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
|
||||
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
|
||||
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
|
||||
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
|
||||
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
|
||||
}
|
||||
|
||||
contextLUT1 = [256]uint8{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
|
||||
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
|
||||
1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
}
|
||||
|
||||
contextLUT2 = [256]uint8{
|
||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
|
||||
}
|
||||
)
|
||||
|
||||
// These LUTs are dynamically computed from the LUTs in the specification.
|
||||
var (
|
||||
contextP1LUT [256 * numContextModes]uint8
|
||||
contextP2LUT [256 * numContextModes]uint8
|
||||
)
|
||||
|
||||
// initContextLUTs computes LUTs so that context ID computation can be
|
||||
// efficiently without any branches.
|
||||
func initContextLUTs() {
|
||||
for i := 0; i < 256; i++ {
|
||||
for m := 0; m < numContextModes; m++ {
|
||||
base := m << 8
|
||||
|
||||
// Operations performed here are specified in RFC section 7.1.
|
||||
switch m {
|
||||
case contextLSB6:
|
||||
contextP1LUT[base+i] = byte(i) & 0x3f
|
||||
contextP2LUT[base+i] = 0
|
||||
case contextMSB6:
|
||||
contextP1LUT[base+i] = byte(i) >> 2
|
||||
contextP2LUT[base+i] = 0
|
||||
case contextUTF8:
|
||||
contextP1LUT[base+i] = contextLUT0[byte(i)]
|
||||
contextP2LUT[base+i] = contextLUT1[byte(i)]
|
||||
case contextSigned:
|
||||
contextP1LUT[base+i] = contextLUT2[byte(i)] << 3
|
||||
contextP2LUT[base+i] = contextLUT2[byte(i)]
|
||||
default:
|
||||
panic("unknown context mode")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// getLitContextID computes the context ID for literals from RFC section 7.1.
|
||||
// Bytes p1 and p2 are the last and second-to-last byte, respectively.
|
||||
func getLitContextID(p1, p2 byte, mode uint8) uint8 {
|
||||
base := uint(mode) << 8
|
||||
return contextP1LUT[base+uint(p1)] | contextP2LUT[base+uint(p2)]
|
||||
}
|
||||
|
||||
// getDistContextID computes the context ID for distances using the copy length
|
||||
// as specified in RFC section 7.2.
|
||||
func getDistContextID(l int) uint8 {
|
||||
if l > 4 {
|
||||
return 3
|
||||
}
|
||||
return uint8(l - 2)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue